среда, 6 марта 2013 г.

Django Создание собственных шаблонных тэгов

Пример собственного шаблонного тэга.

<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()

Комментариев нет:

Отправить комментарий