반응형
datetime객체에 작성일시가 너무 상세하게 나오는데 그걸 필터를 적용해서 바꾸겠습니다.
pybo/filter.py 파일을 만들어주세요
def format_datetime(value, fmt="%Y년 %m월 %d일 %H:%M"):
return value.strftime(fmt)
value에 값이 들어오면 fmt 규격에 따라 datetime객체를 strftime을 이용해 규격에 맞게 변환시켜줍니다.
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
# bluePrint
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)
# 필터
from .filter import format_datetime
app.jinja_env.filters['datetime'] = format_datetime
return app
__init__.py 입니다.
여기에다가 filter를 추가시켜주면 됩니다. jinja_env.filters[필터이름] = 내가 만든 필터함수
app.jinja_env.filters['datetime'] = format_datetime 이런식으로 적용시키면 됩니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% extends 'base.html' %}
{% block content %}
<div class="container my-3 text-center">
<table calss="table" width="100%">
<thead >
<tr class="bg-dark text-white">
<th> 번호 </th>
<th> 제목 </th>
<th> 작성일시 </th>
</tr>
</thead>
<tbody>
{% if question_list %}
{% for question in question_list.items %}
<tr>
<td>{{ loop.index }}</td>
<td><a href="{{ url_for('question.detail', question_id=question.id) }}">{{question.subject}}</a></td>
<td>{{ question.create_date|datetime }}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="3"> 질문이 없습니다. </td>
</tr>
{% endif %}
</tbody>
</table>
<!-- 페이징 -->
<nav aria-label="Page navigation example">
<ul class="pagination pagination-sm my-5 justify-content-center">
<!-- 이전 페이징 구현 (이전 페이지 있을시)-->
{% if question_list.has_prev %}
<li class="page-item">
<a class="page-link" href="?page={{ question_list.prev_num }}">이전</a>
</li>
<!-- 이전 페이지가 없을 시 -->
{% else %}
<li class="page-item disabled">
<a class="page-link" href="">이전</a>
</li>
{% endif %}
<!-- 중간 페이징 -->
{% for page_num in question_list.iter_pages() %}
{% if page_num %}
{% if page_num != question_list.page %}
<li class="page-item">
<a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a>
</li>
{% else %}
<li class="page-item active" aria-current="page">
<a class="page-link" href="#">{{ page_num }}</a>
</li>
{% endif %}
{% else %}
<li class="disabled">
<a class="page-link" href="#">...</a>
</li>
{% endif %}
{% endfor %}
<!-- 다음 페이징 구현 (다음 페이지가 있는 경우_ -->
{% if question_list.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ question_list.next_num }}">다음</a>
</li>
<!-- 다음 페이지 없는 경우 -->
{% else %}
<li class="page-item disabled">
<a class="page-link" tabindex="-1" aria-disabled="true" href="#">다음</a>
</li>
{% endif %}
</ul>
</nav>
</ul>
<a href="{{ url_for('question.create') }}" class="btn btn-primary"> 질문 등록하기 </a>
</div>
{% endblock %}
</body>
</html>
question_list.html 입니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% extends 'base.html' %}
{% block content %}
<div class="container my-3">
<h2 class="border-bottom py-2">{{ question.subject }}</h2>
<div class="card my-3">
<div class="card-body">
<div class="card-text" style="white-space: pre-line;">{{ question.content }}</div>
</div>
<div class="d-flex justify-content-end">
<span class="badge bg-light text-dark">
{{ question.create_date|datetime }}
</span>
</div>
</div>
<h5 class="border-bottom my-3 py-2">{{ question.answer_set|length }}개의 답변이 있습니다.</h5>
{% for answer in question.answer_set %}
<div class="card my-3">
<div class="card-body">
<div class="card-text" style="white-space : pre-line;">
{{ answer.content }}
</div>
<div class="d-flex justify-content-end">
<span class="badge bg-light text-dark">
{{ answer.create_date|datetime }}
</span>
</div>
</div>
</div>
{% endfor %}
<h5> {{ question.answer_set|length }}개의 답변이 있습니다. </h5>
<div>
<ul>
{% for answer in question.answer_set %}
<li> {{ answer.content }}</li>
{% endfor %}
</ul>
</div>
<form class="my-3" action="{{ url_for('answer.create', question_id=question.id) }}" method="post">
{{ form.csrf_token }}
<!-- 오류표시 Start -->
{% for field, errors in form.errors.items() %}
<div class="alert alert-danger" role="alert">
<strong>{{ form[field].label }}</strong>: {{ ','.join(errors) }}
</div>
{% endfor %}
<!-- 오류표시 End -->
<div class="form-group">
<textarea name="content" id="content" row="15"></textarea>
<input class="btn btn-primary" type="submit" value="답변등록">
</div>
</form>
</div>
{% endblock %}
</body>
</html>
question_detail.html 입니다.
create_date -> create_date|datetime 이런식으로 적용시켜주면 됩니다.
(datetime은 jinja_env.filters['datetime']) 이 부분
* badge 부분 수정했습니다.
<span class="badge bg-light text-dark">
... 이런식으로 바꿔주세요
</span>
반응형
'플라스크 (추후 수정)' 카테고리의 다른 글
Flask 질문에 달린 답변 개수 표시하기 (0) | 2021.08.14 |
---|---|
Flask 게시물 번호 바꾸기 (0) | 2021.08.14 |
Flask 페이징 (0) | 2021.08.14 |
Flask Navbar 적용, {% include %} (0) | 2021.08.12 |
Flask 답변 등록 폼검증 수정하기 (0) | 2021.08.12 |