Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Django模板标记扩展为另一个(宏)_Django_Django Templates - Fatal编程技术网

如何使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" %} …扩展到第一个示例 更新:简

我们有一个第三方Django模板标记,如下所示:

{% 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更新问题…宾果,我想这就是我需要的。谢谢@一个受薪的书呆子,我刚刚修复了我答案中的两个小错误。