<!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_set 은 Answer과 동일합니다. 즉, 거기에다가 값을 추가하는 것입니다.
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는 탬플릿 필터인데 객체의 길이를 반환합니다.
'플라스크 (추후 수정)' 카테고리의 다른 글
Flask 모듈화 {% extends %}, {% block content %}, {% endblock %} (0) | 2021.08.12 |
---|---|
Flask CSS, 부트스트랩 적용해보기 (0) | 2021.08.11 |
Flask 질문 목록조회, 상세조회 query.order_by, create_date.desc(), render_template, 탬플릿태그 (if, for, 객체), query.get_or_404, url_for (0) | 2021.08.11 |
Flask 플라스크 셸을 이용해 DB 내용 추가 제거 수정해보기 (0) | 2021.08.10 |
Flask BluePrint, 라우트 함수 (0) | 2021.08.09 |