반응형
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1> {{ question.subject }} </h1>

    <div>
    {{ question.content }}
    </div>

    <form action="{{ url_for('answer.create', question_id=question.id}}" method="post">
        <textarea name="content" id="content" row="15"></textarea>
        <input type="submit" value="답변등록">
    </form>

</body>
</html>
from datetime import datetime

from flask import Blueprint, url_for, request
from werkzeug.utils import redirect

from pybo import db
from pybo.models import Question, Answer

bp = Blueprint('answer', __name__, url_prefix='/answer')

@bp.route('/create/<int:question_id>', methods=('Post', ))
def create(question_id):
    question = Question.query.get_or_404(question_id) # 그 질문에 해당하는 번호를 가져온다.
    content = request.form['content'] # name 속성이 content인 값
    answer = Answer(content=content, create_date=datetime.now()) # textArea 내용, 작성시각
    question.answer_set.append(answer)  # question.answer_set 은 Answer과 동일 즉, 거기에다가 값을 추가하는 것임
    db.session.commit() # db에 저장
    return redirect(url_for('question.detail', question_id=question_id)) # 상세 질문과 답변이 있는 페이지로 전달

 

이번에는 답변 등록 기능을 만들겠습니다.

 

먼저 question_detail.html에 태그를 작성해주세요

그 후 기능을 넣을 부분을 answer_views.py를 작성해서 넣어주세요

 

@bp.route('/create/<int:question_id>', methods=('Post', ))

methods 방식은 form에 적은 거랑 동일해야합니다.

 

content = request.form['content'

from안에 있는 name이 content라는 내용을 가져오는 것입니다.

<textarea name="content" id="content" row="15"></textarea>

 

answer = Answer(content=content, create_date=datetime.now())

textArea 내용, 작성시각을 저장해서 answer이라는 객체에 넣습니다.

 

question.answer_set.append(answer)

question.answer_setAnswer과 동일합니다. 즉, 거기에다가 값을 추가하는 것입니다.


db.session.commit() 

답변 내용을 db에 저장한 걸 적용시킵니다.


return redirect(url_for('question.detail', question_id=question_id)) 

답변을 작성 했으면 다시 상세 질문과 답변이 있는 페이지로 이동해야하니 redirect했습니다.

 

from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

import config

db = SQLAlchemy()
migrate = Migrate()

def create_app():
        app = Flask(__name__)
        app.config.from_object(config) # config.py에 작성 내용을 환경 변수로 부르기 위한 작업

        # ORM
        db.init_app(app) # 우리가 적은 환경으로 DB 초기화
        migrate.init_app(app,db) # DB와 우리가 적은 환경을 다른 환경으로 옮김
        from . import models

        from .views import main_views, question_views, answer_views # .view에서 .은 현재위치의 views 폴더로부터 import한다는 말
        app.register_blueprint(main_views.bp) # 블루프린트 객체 bp 등록
        app.register_blueprint(question_views.bp) # 블루프린트 객체 bp 등록
        app.register_blueprint(answer_views.bp) 

        return app

블루프린터 적용을 __init__.py에 추가해주세요

 

지금까지 등록 답변을 저장하는 기능만 했고 이제 보여주는 기능을 만들겠습니다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1> {{ question.subject }} </h1>

    <div>
        {{ question.content }}
    </div>

    <h5> {{ question.answer_set|length }}개의 답변이 있습니다. </h5>

    <div>
        <ul>
            {% for answer in question.answer_set %}
                <li> {{ answer.content }}</li>
            {% endfor %}
        </ul>
    </div>

    <form action="{{ url_for('answer.create', question_id=question.id) }}" method="post">
        <textarea name="content" id="content" row="15"></textarea>
        <input type="submit" value="답변등록">
    </form>

</body>
</html>

question_detail.html을 수정 해주세요

|length탬플릿 필터인데 객체의 길이를 반환합니다.

반응형