Flask 질문 목록 조회와 질문 상세 조회 기능 만들기
1. 게시판 질문 목록 출력
Question.query.order_by로 질문 목록은 얻을 수 있다. order_by 함수는 조회 결과를 정렬해 준다.
Question.create_date.desc 는 조회된 질문 목록을 작성일시 기준 역순
으로 정렬 하라는 의미이다.
render_template
은 템플릿 파일을 화면에 그려준다.
<!–
# main_views.py
from flask import Blueprint, render_template
from pybo.models import Question
bp = Blueprint('main', __name__, url_prefix='/')
@bp.route('/hello')
def hello_pybo():
return 'Hello, Pybo!'
@bp.route('/')
def index():
question_list = Question.query.order_by(Question.create_date.desc())
return render_template('question/question_list.html',
question_list=question_list)
–>
2. 질문 목록 템플릿 파일 작성
{\% \%}로 둘러싸인 문장을 템플릿 태그라고 한다.
<!-- flask > projects > firstproject > pybo > temlates > question_list.html -->
{\% if question_list \%}
<ul>
{\% for question in question_list \%}
<li><a href="/detail/">}</a></li>
{\% endfor \%}
</ul>
{\% else \%}
<p>질문이 없습니다.</p>
{\% endif \%}
분기문 태그
> {\% if 조건문1 \%}
<p>조건문1에 해당 시 실행</p> {\% elif 조건문2 \%}
<p>조건문2에 해당 시 실행</p> {\% else \%}
<p>조건문1, 2 모두 해당하지 않을 시 실행</p> {\% endif \%}
반복문 태그
> {\% for item in list \%}
<p>순서 : </p> <p></p> {\% endfor \%}
반복문의 loop 속성
loop 속성 | 설명 |
---|---|
loop.index | 반복 순서, 1부터 1씩 증가 |
loop.index() | 반복 순서, 0부터 1씩 증가 |
loop.first | 반복 순서가 첫 번째 순서이면 True 아니면 Fals |
loop.last | 반복 순서가 마지막 순서이면 True 아니면 Fals |
객체 태그 : {{ 객체 }}, {{ 객체.속성 }}
3. 게시판 상세 조회 기능
# flask > projects > firstproject > pybo > views > main_views.py
@bp.route('/detail/<int:question_id>/')
def detail(question_id):
question = Question.query.get(question_id)
return render_template('question/question_detail.html', question=question)
<!-- flask > projects > firstproject > pybo > templates > question > question_detail.html -->
<h1></h1>
<div></div>
# flask > projects > firstproject > pybo > views > main_views.py
@bp.route('/detail/<int:question_id>/')
def detail(question_id):
# question = Question.query.get(question_id)
question = Question.query.get_or_404(question_id)
return render_template('question/question_detail.html', question=question)
get_or_404 함수 경우 404 페이지를 출력해 준다.
4. 블루프린트로 기능 분리
# flask > projects > firstproject > pybo > views > question_views.py
from flask import Blueprint, render_template
from pybo.models import Question
bp = Blueprint('question', __name__, url_prefix='/question')
@bp.route('/list/')
def _list():
question_list = Question.query.order_by(Question.create_date.desc())
return render_template('question/question_list.html',
question_list=question_list)
@bp.route('/detail/<int:question_id>/')
def detail(question_id):
question = Question.query.get_or_404(question_id)
return render_template('question/question_detail.html', question=question)
# 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
app.register_blueprint(main_views.bp)
app.register_blueprint(question_views.bp)
return app
<!-- flask > projects > firstproject > pybo > temlates > question_list.html -->
{\% if question_list \%}
<ul>
{\% for question in question_list \%}
<li>
<a href="\{\{ url_for('question.detail', question_id=question.id)\}\}"
></a
>
</li>
{\% endfor \%}
</ul>
{\% else \%}
<p>질문이 없습니다.</p>
{\% endif \%}