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%} 사이의 이스케이프를 방지한다. |
| |- | | |- |
− | |<code><nowiki>|default:"문자열"</nowiki></code> | + | | |
− | |값이 없거나 False인 경우 대체할 문자열을 지정한다. | + | | |
| |- | | |- |
− | |<nowiki>|truncatechars:숫자</nowiki> | + | | |
− | |제목이 길어질 때 특정 숫자의 글자만 나타내고 싶을 때 사용한다. | + | | |
| |- | | |- |
| |<nowiki>|timesince</nowiki> | | |<nowiki>|timesince</nowiki> |
39번째 줄: |
40번째 줄: |
| 각종 필터함수를 만들 수도 있지만 기능에 관련한 것들은 가능하면 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" | | {| class="wikitable" |
56번째 줄: |
82번째 줄: |
| | | |
| | | |
− | @register.filter | + | @register.filter() |
| def sub(value, arg): | | def sub(value, arg): |
| return value - arg | | return value - arg |
67번째 줄: |
93번째 줄: |
| | | |
| <td><a href="...">{{ posting.like_count|sub:posting.dislike_count }} </a></td> | | <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> | | </syntaxhighlight> |
| |} | | |} |
| [[분류:장고 탬플릿]] | | [[분류:장고 탬플릿]] |