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>