"3. 장고 탬플릿 필터"의 두 판 사이의 차이
(→개요) |
|||
(같은 사용자의 중간 판 8개는 보이지 않습니다) | |||
8번째 줄: | 8번째 줄: | ||
특수기능을 사용할 때 외엔 그닥 쓰이지 않는다. | 특수기능을 사용할 때 외엔 그닥 쓰이지 않는다. | ||
− | + | =탬플릿 필터= | |
파이프문자를 사용하여 함수처럼 작용한다. | 파이프문자를 사용하여 함수처럼 작용한다. | ||
23번째 줄: | 23번째 줄: | ||
|- | |- | ||
|<code><nowiki>|safe</nowiki></code> | |<code><nowiki>|safe</nowiki></code> | ||
− | |XSS를 막기 위해 HTML에서 쓰이는 | + | |view에서 텍스트 데이터를 가공해 보내면 html 안에서 "내용" 형식으로 담긴다. |
+ | XSS를 막기 위해 HTML에서 쓰이는 문자들을 자동으로 이스케이프 처리하는 것이다. | ||
하지만, HTML태그를 그대로 사용해야 할 때가 있는데, safe필터를 사용하여 해당부분의 제한만 풀거나 {%autoescape%}태그를 사용하여 {%endautoescape%} 사이의 이스케이프를 방지한다. | 하지만, HTML태그를 그대로 사용해야 할 때가 있는데, safe필터를 사용하여 해당부분의 제한만 풀거나 {%autoescape%}태그를 사용하여 {%endautoescape%} 사이의 이스케이프를 방지한다. | ||
|- | |- | ||
− | | | + | | |
− | | | + | | |
|- | |- | ||
− | | | + | | |
− | | | + | | |
|- | |- | ||
|<nowiki>|timesince</nowiki> | |<nowiki>|timesince</nowiki> | ||
38번째 줄: | 39번째 줄: | ||
각종 필터함수를 만들 수도 있지만 기능에 관련한 것들은 가능하면 view에서 처리하는 편이 디자이너와의 협업에 좋다. | 각종 필터함수를 만들 수도 있지만 기능에 관련한 것들은 가능하면 view에서 처리하는 편이 디자이너와의 협업에 좋다. | ||
+ | |||
+ | === 문자열 관련 === | ||
+ | {| class="wikitable" | ||
+ | !필터 | ||
+ | !설명 | ||
+ | |- | ||
+ | |<code><nowiki>|default:"문자열"</nowiki></code> | ||
+ | |값이 없거나 False인 경우 대체할 문자열을 지정한다. | ||
+ | |- | ||
+ | |<nowiki>|truncatechars:숫자</nowiki> | ||
+ | |제목이 길어질 때 특정 숫자의 글자만 나타내고 싶을 때 사용한다. | ||
+ | 잘린 부분이 있을 때 '...'으로 나타낸다. | ||
+ | |- | ||
+ | |<nowiki>|truncatewords:숫자</nowiki> | ||
+ | |특정 개수의 단어만 나타내고 싶을 때. | ||
+ | |- | ||
+ | |<nowiki>|linebreaks</nowiki> | ||
+ | |마크다운을 사용하지 않고 줄바꿈만 반영하고 싶을 때. | ||
+ | |- | ||
+ | |<nowiki>|slice</nowiki> | ||
+ | |truncatechars 값이 2일 때 1글자만 나타내고 '...'으로 정리해버린다. | ||
+ | |||
+ | 2글자 다 나타내고 싶을 땐 slice를 사용하는 게 좋다. | ||
+ | |||
+ | 다음처럼 사용하기도 한다. <code><nowiki>{{값|slice:2}}</nowiki>{% if 값|length > 2 %}...{% endif %}</code> | ||
+ | |} | ||
+ | = 커스텀 필터 만들기 = | ||
+ | 놀랍게도 탬플릿 필터 안에 뺄셈이 없다. 하여간, 이런저런 경우 커스텀 필터를 만들어주어야 하는 경우가 생기는데, 빼기 필터를 만들 경우, 다음과 같이 진행한다. | ||
+ | {| class="wikitable" | ||
+ | !과정 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |필터 디렉터리 및 파일 만들기 | ||
+ | | | ||
+ | * 앱 안에 <code>templatetags</code> 디렉터리를 만든다. | ||
+ | * 이 디렉터리 안에 <code>posting_filter.py</code>를 만든다.(이름은 짓기 나름) | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | from django import template | ||
+ | |||
+ | register = template.Library() | ||
+ | |||
+ | |||
+ | @register.filter() | ||
+ | def sub(value, arg): | ||
+ | return value - arg | ||
+ | </syntaxhighlight> | ||
+ | |- | ||
+ | |필터 사용 | ||
+ | |탬플릿 안에서 필터를 불러온 후 사용한다. | ||
+ | |<syntaxhighlight lang="html+django"> | ||
+ | {% load posting_filter %} | ||
+ | |||
+ | <td><a href="...">{{ posting.like_count|sub:posting.dislike_count }} </a></td> | ||
+ | </syntaxhighlight> | ||
+ | |} | ||
+ | |||
+ | === 커스텀 필터의 고급사용 === | ||
+ | 모든 페이지에 들어가는 view가 필요한데(알림처럼), 그럴 때 view를 일일이 수정해주어야 하기엔 너무 번거롭다. 이럴 땐 탬플릿 필터를 작성하여 base.html에 넣는 편이 좋다. | ||
+ | {| class="wikitable" | ||
+ | !과정 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |필터 디렉터리 및 파일 만들기 | ||
+ | | | ||
+ | * 앱 안에 <code>templatetags</code> 디렉터리를 만든다. | ||
+ | * 이 디렉터리 안에 <code>custom_tags.py</code>를 만든다.(이름은 짓기 나름) | ||
+ | * @register 안의 경로는, 해당 필터를 구현할 html 경로를 지정한다. | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | from django import template | ||
+ | from custom_account.models import Notification | ||
+ | |||
+ | register = template.Library() | ||
+ | @register.inclusion_tag('custom_account/notification.html', takes_context=True) | ||
+ | def show_notifications(context): | ||
+ | to_user = context['request'].user | ||
+ | notifications = Notification.objects.filter(to_user=to_user) | ||
+ | return {'notifications':notifications} | ||
+ | </syntaxhighlight> | ||
+ | |- | ||
+ | |필터 사용 | ||
+ | |탬플릿 안에서 필터를 불러온 후 사용한다. | ||
+ | |||
+ | * custom_tags는 필터를 저장한 파일명이다. | ||
+ | |<syntaxhighlight lang="html+django"> | ||
+ | {% load custom_tags %} | ||
+ | {% show_notifications %} | ||
+ | </syntaxhighlight> | ||
+ | |} | ||
[[분류:장고 탬플릿]] | [[분류:장고 탬플릿]] |
2022년 11월 18일 (금) 11:31 기준 최신판
1 개요[편집 | 원본 편집]
탬플릿 내에서 함수처럼 쓰이는 기능이다.(굳이 탬플릿에서 처리할 게 아니라, 연산은 view에서 처리한 후 결과 변수로 넣는 편이 편할 것 같은데..)
그저 데이터형이라든가.. 간단한 조작을 할 땐 유용하다.
특수기능을 사용할 때 외엔 그닥 쓰이지 않는다.
2 탬플릿 필터[편집 | 원본 편집]
파이프문자를 사용하여 함수처럼 작용한다.
{{변수|필터}}
형태로 사용한다.
{{변수|필터|필터2}} 형태로 중복해 사용할 수도 있다.
필터 | 설명 |
---|---|
|add:숫자
|
숫자만큼 더한다.(음수도 가능) |
|safe
|
view에서 텍스트 데이터를 가공해 보내면 html 안에서 "내용" 형식으로 담긴다.
XSS를 막기 위해 HTML에서 쓰이는 문자들을 자동으로 이스케이프 처리하는 것이다. 하지만, HTML태그를 그대로 사용해야 할 때가 있는데, safe필터를 사용하여 해당부분의 제한만 풀거나 {%autoescape%}태그를 사용하여 {%endautoescape%} 사이의 이스케이프를 방지한다. |
|timesince | 시간 데이터에 붙는다.
게시판에서 작성된지 얼마나 지났는지 보여주기 위해. |
더 많은 필터는 https://docs.djangoproject.com/en/3.1/ref/templates/builtins/ 등의 문서를 뒤지자.
각종 필터함수를 만들 수도 있지만 기능에 관련한 것들은 가능하면 view에서 처리하는 편이 디자이너와의 협업에 좋다.
2.1 문자열 관련[편집 | 원본 편집]
필터 | 설명 |
---|---|
|default:"문자열"
|
값이 없거나 False인 경우 대체할 문자열을 지정한다. |
|truncatechars:숫자 | 제목이 길어질 때 특정 숫자의 글자만 나타내고 싶을 때 사용한다.
잘린 부분이 있을 때 '...'으로 나타낸다. |
|truncatewords:숫자 | 특정 개수의 단어만 나타내고 싶을 때. |
|linebreaks | 마크다운을 사용하지 않고 줄바꿈만 반영하고 싶을 때. |
|slice | truncatechars 값이 2일 때 1글자만 나타내고 '...'으로 정리해버린다.
2글자 다 나타내고 싶을 땐 slice를 사용하는 게 좋다. 다음처럼 사용하기도 한다. |
3 커스텀 필터 만들기[편집 | 원본 편집]
놀랍게도 탬플릿 필터 안에 뺄셈이 없다. 하여간, 이런저런 경우 커스텀 필터를 만들어주어야 하는 경우가 생기는데, 빼기 필터를 만들 경우, 다음과 같이 진행한다.
과정 | 설명 | 방법 |
---|---|---|
필터 디렉터리 및 파일 만들기 |
|
from django import template
register = template.Library()
@register.filter()
def sub(value, arg):
return value - arg
|
필터 사용 | 탬플릿 안에서 필터를 불러온 후 사용한다. | {% load posting_filter %}
<td><a href="...">{{ posting.like_count|sub:posting.dislike_count }} </a></td>
|
3.1 커스텀 필터의 고급사용[편집 | 원본 편집]
모든 페이지에 들어가는 view가 필요한데(알림처럼), 그럴 때 view를 일일이 수정해주어야 하기엔 너무 번거롭다. 이럴 땐 탬플릿 필터를 작성하여 base.html에 넣는 편이 좋다.
과정 | 설명 | 방법 |
---|---|---|
필터 디렉터리 및 파일 만들기 |
|
from django import template
from custom_account.models import Notification
register = template.Library()
@register.inclusion_tag('custom_account/notification.html', takes_context=True)
def show_notifications(context):
to_user = context['request'].user
notifications = Notification.objects.filter(to_user=to_user)
return {'notifications':notifications}
|
필터 사용 | 탬플릿 안에서 필터를 불러온 후 사용한다.
|
{% load custom_tags %}
{% show_notifications %}
|