如何使Django模板标签扩展到另一个(宏)

时间:2011-09-28 21:49:33

标签: django django-templates

我们有一个像这样的第三方Django模板标签:

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

不幸的是,每次我们使用do stuff with {{ frobnicator }}标记时都会重复{% frobnicate %}部分。

构建标记的最简单方法是什么,比如

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

...扩展到第一个例子?

更新:简单的包含标记是不够的。我在上面的例子中没有说清楚,但我需要能够操纵传递给扩展的参数。

1 个答案:

答案 0 :(得分:2)

创建一个模板过滤器,用于呈现custom string instead of a template file

声明为此(此代码经过测试)

#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" %}呈现整个whird-party标记序列。