我的模板标签在 Django 模板中为何不起作用?

3
{% gen_aws "hello" %}

在我的文件中,我这样做:
# I want to add "goodbye" to every word passed to this tag.
@register.tag(name="gen_aws")
def gen_aws(s):
    return s + "goodbye"

.py文件很好...我正常地包含了一切。我在那里有其他的模板过滤器,它们也很好用。但是当我添加了这个模板标签时,它就不能工作了。

3个回答

9
您所描述的“不起作用”并不十分准确(确切地说,它不存在)。但我猜您会因为找不到标签而出现错误。 文档清楚地说明,您需要在应用程序中创建一个名为“templatetags”的模块,例如“mytags”的子模块。然后,您必须在想要使用它们的每个模板中包含这些标签。您可以使用{% load mytags %}来实现。
然后,“mytags”模块将包含您的“gen_aws”标签。 编辑:“gen_aws()需要1个参数(给定2个)”错误是由于普通标签可以以非常定制化的方式解析其参数。因此,它们获得“parser”和“token”参数。在您的情况下,所谓的简单标签就足够了 - Django然后自动为您解析参数并将它们作为Python值传递。因此,只需将@register.tag替换为@register.simple_tag即可。

@TIMEX:那么你的问题到底是什么? - AndiDog
gen_aws()函数只需要1个参数,但是给出了2个。 - TIMEX
1
当我将它更改为:gen_aws(a,s)时,我会得到这个错误:“'str' object has no attribute 'must_be_first'”。 - TIMEX

6
另一个可能导致"no attribute 'must_be_first'"错误的原因是您在类中忘记继承django.template.Node。 (由于这几乎是该短语的唯一谷歌结果,我想在此添加以节省下一个人的几分钟时间。)

1
你需要使用如下所示的@register.simple_tag,而不是@register.tag。前者可以获取模板标签的值和令牌,而后者只能获取令牌。你可以查看我的回答,了解更多关于@register.simple_tag@register.tag的信息:
# @register.tag(name="gen_aws")
@register.simple_tag(name="gen_aws")
def gen_aws(s):
    return s + "goodbye"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接