我们有一个像这样的第三方Django模板标签:
{% frobnicate "foo", "bar", "baz" %}
do stuff with {{ frobnicator }}
{% endfrobnicate %}
不幸的是,每次我们使用do stuff with {{ frobnicator }}
标记时都会重复{% frobnicate %}
部分。
构建标记的最简单方法是什么,比如
{% frobnicate2 "foo", "bar", "baz" %}
...扩展到第一个例子?
更新:简单的包含标记是不够的。我在上面的例子中没有说清楚,但我需要能够操纵传递给扩展的参数。
答案 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标记序列。