如何使Django模板标记扩展为另一个(宏)
我们有一个第三方Django模板标记,如下所示:如何使Django模板标记扩展为另一个(宏),django,django-templates,Django,Django Templates,我们有一个第三方Django模板标记,如下所示: {% frobnicate "foo", "bar", "baz" %} do stuff with {{ frobnicator }} {% endfrobnicate %} 不幸的是,每当我们使用{%frobnitate%}标记时,do stuff with{{{{frobnitator}}部分就会重复 构建标记的最简单方法是什么 {% frobnicate2 "foo", "bar", "baz" %} …扩展到第一个示例 更新:简
{% frobnicate "foo", "bar", "baz" %}
do stuff with {{ frobnicator }}
{% endfrobnicate %}
不幸的是,每当我们使用{%frobnitate%}
标记时,do stuff with{{{{frobnitator}}
部分就会重复
构建标记的最简单方法是什么
{% frobnicate2 "foo", "bar", "baz" %}
…扩展到第一个示例
更新:简单的包含标记是不够的。我在上面的示例中没有明确说明,但我需要能够操作传递给扩展的参数。创建一个模板过滤器,该过滤器将呈现您的 这样声明它(此代码经过测试):
#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({}))
别忘了用正在加载的实际第三方库的名称替换“我的第三方FrobInstactor库”
然后,您可以使用
{%frobnicate2“foo”、“bar”、“baz”%}
呈现整个whird party标记序列 你是说也许是丹尼尔罗斯曼?我不确定他们是否能满足我的要求。我会重读文件的。@DanielRoseman更新问题…宾果,我想这就是我需要的。谢谢@一个受薪的书呆子,我刚刚修复了我答案中的两个小错误。