【问题标题】:Django template tags with same name具有相同名称的 Django 模板标签
【发布时间】:2015-05-14 05:02:15
【问题描述】:

例如我有 2 个模板标签

app1  
    templatetags  
        app1_tags.py  
            def custom_tag()  
app2  
    templatetags  
        app2_tags.py  
            def custom_tag()  

如果我在模板中加载两个模板标签

{% load app1_tags %}
{% load app2_tags %}

我有两个名称为custom_tag 的标签。如何在我的模板中使用它们?我必须重命名它们吗?

【问题讨论】:

  • 我似乎找不到答案,我很想知道这是否可能。
  • 这两个应用程序都是您创作的吗?

标签: django templatetags


【解决方案1】:

我知道这不是最好的解决方案,但根据您的需要,它可能会有所帮助。

仅适用于应用由您制作或您覆盖模板标签

这个选项是给每个标签不同的名字:

app1_tags.py

@register.filter(name='custom1')
def custom_tag():
    # Your code

app2_tags.py

@register.filter(name='custom2')
def custom_tag():
    # Your code

通常如果你注册标签而不告诉名称,Django 将使用该函数作为过滤器名称,但如果你在注册过滤器时传递 arg 'name',Django 将使用它作为模板标签名称。

Django: Custom Template tag

如果你在注册标签时给他们不同的名字,那将是你用来加载标签的名字

{% load custom1 %}
{% load custom2 %}

您只需要自定义其中一个的名称,您可以使用另一个的原始名称

导入不同名称的标签

正如@Igor 建议的那样,另一种选择是导入您要使用另一个名称的模板,比如一个别名,这样您就可以避免具有相同名称的不同标签/过滤器之间的冲突。

假设你想将标签导入你的项目,你应该像这样添加标签:

your_app/template_tags/my_custom_tag

要从 app2 中导入不同名称的标签,您只需添加到文件 my_custom_tag

from app2.template_tags.app2_tags import custom_tag

register.filter(name="new_custom_tag_name", custom_tag)

在此之后,您已将标签 custom_tag 导入到您的项目中,并使用新名称 new_custom_tag_name

【讨论】:

  • 好的,谢谢。此解决方案适用于创建自定义标签。但是如果 app1 和 app2 不是我的应用程序,它并不能解决问题。如果它支持命名空间就好了。
  • 我尝试了命名空间,或在模板中重命名,但无法正常工作。此解决方案仅在模板标签由您制作或您在应用程序中覆盖它们时才有效
  • 如果这两个应用都不是你的,你可以在你的 app3 app3/template_tags/my_tag 中创建一个新的模板库。在那里您可以从 app2 导入标签并使用新名称注册它。 from app2.template_tags.app2_tags import custom_tag; register.filter(name="my_custom_tag", custom_tag)
  • 很好,这与我的回答类似,但我认为更适合这个问题,如果您不介意,我会将此信息添加到我的回答中
猜你喜欢
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2012-01-04
  • 2021-07-10
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2013-11-11
相关资源
最近更新 更多