| 3번째 줄: |
3번째 줄: |
| | == 개요 == | | == 개요 == |
| | 탬플릿 내에서 함수처럼 쓰이는 기능이다.(굳이 탬플릿에서 처리할 게 아니라, 연산은 view에서 처리한 후 결과 변수로 넣는 편이 편할 것 같은데..) | | 탬플릿 내에서 함수처럼 쓰이는 기능이다.(굳이 탬플릿에서 처리할 게 아니라, 연산은 view에서 처리한 후 결과 변수로 넣는 편이 편할 것 같은데..) |
| | + | |
| | + | 그저 데이터형이라든가.. 간단한 조작을 할 땐 유용하다. |
| | | | |
| | 특수기능을 사용할 때 외엔 그닥 쓰이지 않는다. | | 특수기능을 사용할 때 외엔 그닥 쓰이지 않는다. |
| | | | |
| − | ==탬플릿 필터==
| + | =탬플릿 필터= |
| | 파이프문자를 사용하여 함수처럼 작용한다. | | 파이프문자를 사용하여 함수처럼 작용한다. |
| | | | |
| 21번째 줄: |
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> |
| | + | |시간 데이터에 붙는다. |
| | + | 게시판에서 작성된지 얼마나 지났는지 보여주기 위해. |
| | + | |}더 많은 필터는 https://docs.djangoproject.com/en/3.1/ref/templates/builtins/ 등의 문서를 뒤지자. |
| | + | |
| | + | 각종 필터함수를 만들 수도 있지만 기능에 관련한 것들은 가능하면 view에서 처리하는 편이 디자이너와의 협업에 좋다. |
| | + | |
| | + | === 문자열 관련 === |
| | + | {| class="wikitable" |
| | + | !필터 |
| | + | !설명 |
| | |- | | |- |
| | |<code><nowiki>|default:"문자열"</nowiki></code> | | |<code><nowiki>|default:"문자열"</nowiki></code> |
| | |값이 없거나 False인 경우 대체할 문자열을 지정한다. | | |값이 없거나 False인 경우 대체할 문자열을 지정한다. |
| − | |}더 많은 필터는 https://docs.djangoproject.com/en/3.1/ref/templates/builtins/ 등의 문서를 뒤지자. | + | |- |
| | + | |<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> |
| | + | |- |
| | + | |필터 사용 |
| | + | |탬플릿 안에서 필터를 불러온 후 사용한다. |
| | | | |
| − | 각종 필터함수를 만들 수도 있지만 기능에 관련한 것들은 가능하면 view에서 처리하는 편이 디자이너와의 협업에 좋다.
| + | * custom_tags는 필터를 저장한 파일명이다. |
| | + | |<syntaxhighlight lang="html+django"> |
| | + | {% load custom_tags %} |
| | + | {% show_notifications %} |
| | + | </syntaxhighlight> |
| | + | |} |
| | [[분류:장고 탬플릿]] | | [[분류:장고 탬플릿]] |