django 템플릿, 사용자 정의 탭 및 Filter
8483 단어 django
사용자 정의 레이블은 크게 세 가지 범주로 나뉩니다.
1、닫히지 않은 태그 예를 들어 {% current time "%Y-%m-%d%I:%M%p"%}
2、닫힌 탭은 {%upper%} {%endupper%}
3, inclusion 태그 예: {% books for author author%}
탭을 정의하는 데는 두 가지 작업이 필요합니다. 첫째, 컴파일 함수 정의, 둘째,node 정의.
컴파일 함수의 역할은 사용자 정의 node의render에 필요한 매개 변수를 계산하여 사용할 수 있도록 하는 것이다.예를 들어 사용자 정의 tag의 매개 변수 등을 분리하거나 폐쇄된 탭의 nodelist를 계산합니다.사용자 정의 node의 목적은 이 탭의render 함수를 제공하여 결과를 되돌려주거나context에 저장하는 것입니다
닫히지 않은 태그
{% current time "%Y-%m-%d%I:%M%p"%} 정의를 예로 들면
1) 컴파일 함수를 정의합니다.
from django import template
register = template.Library()
@register.tag(name="current_time")
def do_current_time(parser, token):
try:
# split_contents() knows not to split quoted strings.
tag_name, format_string = token.split_contents()
except ValueError:
msg = '%r tag requires a single argument' % token.split_contents()[0]
raise template.TemplateSyntaxError(msg)
return CurrentTimeNode(format_string[1:-1])
2) node 정의
import datetime
class CurrentTimeNode(template.Node):
def __init__(self, format_string):
self.format_string = str(format_string)
def render(self, context):
now = datetime.datetime.now()
return now.strftime(self.format_string)
import re
class CurrentTimeNode3(template.Node):
def __init__(self, format_string, var_name):
self.format_string = str(format_string)
self.var_name = var_name
def render(self, context):
now = datetime.datetime.now()
context[self.var_name] = now.strftime(self.format_string)
return ''
또 다른 비폐쇄 라벨 중 비교적 자주 사용되고 복잡한 예
사용자 정의 tag:{% get current time "%Y-%M-%d%I:%M%p"as my current time%}
def do_current_time(parser, token):
# This version uses a regular expression to parse tag contents.
try:
# Splitting by None == splitting by spaces.
tag_name, arg = token.contents.split(None, 1)
except ValueError:
msg = '%r tag requires arguments' % token.contents[0]
raise template.TemplateSyntaxError(msg)
m = re.search(r'(.*?) as (\w+)', arg)
if m:
fmt, var_name = m.groups()
else:
msg = '%r tag had invalid arguments' % tag_name
raise template.TemplateSyntaxError(msg)
if not (fmt[0] == fmt[-1] and fmt[0] in ('"', "'")):
msg = "%r tag's argument should be in quotes" % tag_name
raise template.TemplateSyntaxError(msg)
return CurrentTimeNode3(fmt[1:-1], var_name)
라벨 닫기,
{%upper%} {%endupper%}를 예로 들다
def do_upper(parser, token):
"""
node nodelist, UpperNode
"""
nodelist = parser.parse(('endupper',))
parser.delete_first_token()
return UpperNode(nodelist)
class UpperNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
"""
nodelist node render() , output , output
"""
def render(self, context):
output = self.nodelist.render(context)
return output.upper()
포함 태그
포함 태그, 이 태그에 맞는 템플릿이 필요합니다.예를 들어 {% books for author author%}는 두 가지 측면에서만 작업을 할 수 있다. 하나는 탭의 매개 변수(이 예의author) 함수를 사용자 정의하고 값을 템플릿 파일의 입력 매개 변수로 되돌려주는 것이다(이 예의 {'books': books}).두 번째는 템플릿 tag 파일을 정의하는 것입니다
@register.inclusion_tag('book_snippet.html')
def books_for_author(author):
books = Book.objects.filter(authors__id=author.id)
return {'books': books}
템플릿 파일:
book_snippet.html
<ul>
{% for book in books %}
<li>{{ book.title }}</li>
{% endfor %}
</ul>
사용자 지정 필터
from django import template
register = template.Library()
@register.filter(name='cut')
def cut(value, arg):
return value.replace(arg, '')
사용 방법: {{{{somevariable|cut:""}
여기의somevariable는cut의value입니다. ""는arg입니다. 전체 Filter의 역할은somevariable의 "(빈칸) 을"(빈칸) 으로 바꾸는 것입니다. 즉somevariable의 빈칸을 없애는 것입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.