Django 检查标记是否仅在模板中使用一次

Django 检查标记是否仅在模板中使用一次,django,django-templates,django-filter,django-tagging,Django,Django Templates,Django Filter,Django Tagging,我编写了一个用于django模板的自定义标记: {%my\u custom\u tag%} 使用django频道,它扩展了一些页面功能。但我担心用户可能会意外地将这个标签插入模板两次,这可能会产生一些问题,因为频道会两次提供相同的信息等等 是否有相对简单的方法来检查标记是否只在模板中使用一次,否则会引发错误?您可以对上下文进行模拟,并将某个键(最好是其他应用程序未使用的键)设置为True,否则会引发异常。例如: @register.simple_tag(takes_context=True) d

我编写了一个用于django模板的自定义标记:
{%my\u custom\u tag%}

使用django频道,它扩展了一些页面功能。但我担心用户可能会意外地将这个标签插入模板两次,这可能会产生一些问题,因为频道会两次提供相同的信息等等


是否有相对简单的方法来检查标记是否只在模板中使用一次,否则会引发错误?

您可以对上下文进行模拟,并将某个键(最好是其他应用程序未使用的键)设置为
True
,否则会引发异常。例如:

@register.simple_tag(takes_context=True)
def my_custom_tag(context):
    if '__some_weird_name__for_my_custom_tag' in context:
        raise Exception('my_custom_tag is already used')
    context['__some_weird_name__for_my_custom_tag'] = True
    # ...
    # do other logic
    pass
@register.simple\u标记(接受上下文=True)
定义我的自定义标签(上下文):
如果上下文中的“\u我的\u自定义\u标记的某些\u奇怪的\u名称\u”:
引发异常('我的\u自定义\u标记已被使用')
上下文[''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
# ...
#你有其他逻辑吗
通过
当然,条件是最初不将具有此名称的内容传递给上下文

此外,如果要在一个视图中执行多个
渲染(..)
s,这些渲染通常会有单独的上下文,但这可能是需要的


请注意,该错误是在运行时引发的。因此,我们不会主动检测发生这种情况的模板,但如果发生这种情况,我们将得到一个错误。

我喜欢您的方法。但我有一个问题:django中的{%extends%}标记中也有相同的功能:当我们多次使用它时,会引发错误。他们是这样做的(只是从django source复制粘贴):这不是更好吗?@PhilippChapkovski:这并不保证它发生两次以上:它保证每个文件不会发生一次以上。那是不一样的。例如,文件可以
{%extends otherfile.html%}
,而
otherfile.html
可以包含额外的
{%extends andanotherfile.html%}
。因此,您可以“解析”文件的抽象语法树。@PhilippChapkovski:请看这里的示例:啊,我明白了,您完全正确。它还可能包含{%include%}指向使用{%my_custom_tag%}的文件,并且您的方法也会阻止这一点。酷,谢谢!!