바뀜

둘러보기로 가기 검색하러 가기
2,017 바이트 추가됨 ,  2022년 11월 18일 (금) 11:31
편집 요약 없음
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>
 
|}
 
|}
 
[[분류:장고 탬플릿]]
 
[[분류:장고 탬플릿]]

둘러보기 메뉴