Как сделать тег шаблона Django, который расширяется в другой (макрос) - PullRequest
1 голос
/ 29 сентября 2011

У нас есть сторонний шаблонный тег Django, подобный этому:

{% frobnicate "foo", "bar", "baz" %}
  do stuff with {{ frobnicator }}
{% endfrobnicate %}

К сожалению, часть do stuff with {{ frobnicator }} повторяется каждый раз, когда мы используем тег {% frobnicate %}.

Какой самый простой способ создать тег, чтобы что-то вроде

{% frobnicate2 "foo", "bar", "baz" %}

... раскрывается в первом примере?

Обновление: Недостаточно простых тегов включения. Я не прояснил это в примере выше, но мне нужно иметь возможность манипулировать параметрами, передаваемыми в расширение.

1 Ответ

2 голосов
/ 04 ноября 2011

Создайте фильтр шаблона, который будет отображать вашу пользовательскую строку вместо файла шаблона .

Объявите его следующим образом (этот код проверен) :

#app_name/templatetags/frobnicative_tags.py
from django.template import Template, Context
register = Library()

@register.tag(name = 'frobnicate2')
def frobnicate2(parser, token):
    args = token.split_contents()
    template_string = """
       {%% load my-third-party-frobnicator-lib %%}
       {%% frobnicate %s %%}
          do stuff with {{ frobnicator }}
       {%% endfrobnicate %%}
    """   
    return Frobnicate2(''.join(args[1:]), template_string)

class Frobnicate2(template.Node):
    def __init__(self, frobnicative_args, template_string):
        self.template_string = template_string
        self.args = frobnicative_args

    def render(self, context):
        """
        Dict inside a Context() is empty because we
        need to pass a context in order to render, even if
        the context is empty.
        """   
        return Template(self.template_string % self.args).render(Context({}))

Не забудьте заменить " my-Third-Party-frobnicator-lib " именем фактической сторонней библиотеки, которую вы загружаете.

Затем вы можете визуализировать всю последовательность тегов сторонних разработчиков, используя {% frobnicate2 "foo", "bar", "baz" %} так, как вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...