[Flask] 3-3 템플릿 필터 직접 만들어 보기

2023. 12. 2. 19:47Web/Flask

728x90

이번에는  템플릿 필터를 직접 만드는 방법에 대해서 알아보자

템플릿 필터는 이미 전체 답변 개수를 구할 때 해보았다

{{ question.answer_set|length }}와 같이 템플릿에서 사용한 객체에 파이프라인 문자 |를 붙여 필터 기능을 한다

( {{ question.answer_set|length }}의 length는 전체 답변 개수를 구할 때 사용한 템플릿 필터이다)

 

질문 목록 화면의 작성일시를 보자

작성일시의 날짜값은 datetime 객체이다

현재 질문 목록 템플릿에서는 datetime 객체를 문자열로 표시했으므로

2023-12-02 16:56:38.933828과 같은 값으로 표시된다

대부분의 게시판 서비스에서는 시간을 이런 식으로 표시하지 않는다

템플릿 필터를 사용하면 이런 출력 문자열을 다듬을 수 있다

 

템플릿 필터 만들기

먼저 datetime 객체를 보기 편한 문자열로 만들수 있는 템플릿 필터를 만들어보자

아래처럼 pybo/filter.py 파일을 생성하자

[파일명: projects/myproject/pybo/filter.py]

filter.py 파일을 pybo디렉터리가 있는곳에 생성하고 위와 같이 format_datetime 함수를 만들었다

format_datetime 함수는 전달받은 datetime 객체(value)를

날짜포맷형식(fmt)에 맞게 변환하여 리턴하는 함수이다

만약 fmt가 전달되지 않을 경우 디폴트 값인 '%Y년 %m월 %d일 %p %I:%M'이 적용된다

항목 설명
%Y
%m
%d
%p AM, PM (오전, 오후의 구분)
%I 시간 (0~12 시로 표현)
%M

 

앱에 필터 등록하기

필터를 템플릿에서 사용하려면 pybo/__init__.py 파일의 create_app 함수를 아래처럼 수정해야 한다

[파일명: projects/myproject/pybo/__init__.py]

format_datetime 함수를 임포트한 다음 app.jinja_env.filters['datetime']와 같이

datetime이라는 이름으로 필터를 등록해 주었다

 

필터 사용해 보기

이제 필터를 사용할 차례이다

먼저 질문 목록 템플릿에 작성한 필터를 적용해 보자

{{ question.create_date|datetime }}과 같이 파이프라인 문자와 함께 datetime 필터를 적용했다

datetime 필터가 적용되었으므로 format_datetime 필터 함수가 실행된다

이때 format_datetime의 매개변수 value에 question.create_date가 전달된다

 

질문 목록 페이지로 이동해 보면 필터가 적용된 작성일시를 확인할 수 있다

 

질문 상세 화면에 필터 적용하기

질문 상세 템플릿에도 같은 필터를 적용하자

[파일명: projects/myproject/pybo/templates/question/question_detail.html]

질문 생성일시인 question.create_date와 답변 생성일시인 answer.create_date에 datetime 필터를 적용했다

 

질문 상세 페이지로 이동해 보면 필터가 적용된 화면을 확인할 수 있다

 

여기서는 템플릿 필터를 직접 작성하고,

이 필터를 템플릿에 적용하는 방법을 알아보았다

728x90