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의 빈칸을 없애는 것입니다.

좋은 웹페이지 즐겨찾기