Пример собственного шаблонного тэга.
<p>The time is {% current_time "%Y-%m-%d %I:%M %p" %}.</p>
Пример создания и регистрации шаблонного тэга.
/templatetags/tags.py
from django import template
def do_current_time(parser, token):
try:
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 CurrenTimeNode(format_string[1:-1])
# token.contents - это current_time "%Y-%m-%d %I:%M %p"
# Метод token.split_contents() отделяет current_time от "%Y-%m-%d %I:%M %p", не трогая строку в кавычках. Избегайте использование стандартного метода разбиения строк по пробелу token.contents.split(), так как такой метод не учитывает кавычки, разбивая все по пробелам.
# Таким образом после token.split_contents(): tag_name = "current_time", format_string = "%Y-%m-%d %I:%M %p".
# token.split_contents()[0] - всегда получает имя вашего тэга. В данном случае это "current_time".
# format_string[1:-1] убирает кавычки из "%Y-%m-%d %I:%M %p". Получается просто %Y-%m-%d %I:%M %p.
# Функция CurrenTimeNode(%Y-%m-%d %I:%M %p) - это наша функция типа Node.
import datetime
class CurrentTimeNode(template.Node):
def __init__(self, format_string):
self.format_string = format_string
def render(self, context):
now = datetime.datetime.now()
return now.strftime(self.format_string)
# Функция __init__() производит компиляцию шаблонного тэга.
# Функция render() производит рендеринг шаблонного тэга.
# Регистрация нашего тэга.
from django import template
register = template.Library()
register.tag('current_time', do_current_time) # 1 - имя тэга, 2 - функция компиляции тэга.
# Альтернативный вариант регистрации шаблонного тэга.
@register.tag('current_time', do_current_time)
def do_current_time(parser, token):
try:
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 CurrenTimeNode(format_string[1:-1])
@register.tag
def shout(parser, token):
pass
# Если вы не укажете аргумент name в @register.tag, то Django будет использовать имя функции в качестве имени тега.
# Полный пример шаблонной библиотеки тэгов.
/templatetags/filters.py
from django import template
register = template.Library()
@register.tag('current_time', do_current_time)
def do_current_time(parser, token):
try:
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 CurrenTimeNode(format_string[1:-1])
@register.tag('shout', shout)
def shout(parser, token):
pass
# Пример двойного шаблонного тэга.
{% upper %}
This will appear in uppercase, {{ your_name }}.
{% endupper %}
from django import template
register = template.Library()
@register.tag
def do_upper(parser, token):
nodelist = parser.parse(('endupper',))
parser.delete_first_token()
return UpperNode(nodelist)
class UpperNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
def render(self, context):
output = self.nodelist.render(context)
return output.upper()
Комментариев нет:
Отправить комментарий