Flask 답변 등록 기능 만들기



1. 답변 등록 버튼 만들기


form 엘리먼트 action 속성에 지정된 url_for(‘answer.create’, question_id=question.id) 함수가 알려 준다.

<!-- flask > projects > firstproject > pybo > temlates > question_detail.html -->

<h1></h1>

<div></div>

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



2. 답변 블루프린트 만들기


1번에서 작성한 답변 저장 템플릿의 form 엘리먼트는 POST 방식이었으므로 같은 값을 지정해야 한다.

question.answer_set은 질문에 달린 답변들을 의미한다. backref에 설정한 answer_set을 기억한다.

# flask > projects > firstproject > pybo > views > answer_views.py
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']
    answer = Answer(content=content, create_date=datetime.now())
    question.answer_set.append(answer)
    db.session.commit()
    return redirect(url_for('question.detail', question_id=question_id))



3. 답변 블루프린트 적용


# flask > projects > firstproject > pybo > __init__.py
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)

    # ORM
    db.init_app(app)
    migrate.init_app(app, db)
    from . import models

    from .views import main_views, question_views, answer_views
    app.register_blueprint(main_views.bp)
    app.register_blueprint(question_views.bp)
    app.register_blueprint(answer_views.bp)

    return app



질문 상세 페이지에 답변 표시하기


`` 코드는 답변 개수를 의미한다. length는 템플릿 필터인데 객체의 길이를 반환해 준다. 이처럼 필터는 문자 뒤에 추가해서 사용한다.
<!-- flask > projects > firstproject > pybo > temlates > question_detail.html -->

<h1></h1>

<div></div>

<h5>개의 답변이 있습니다.</h5>
<div>
  <ul>
    {\% for answer in question.answer_set \%}
    <li></li>
    {\% endfor \%}
  </ul>
</div>

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