Django自定义模板标签在循环中未被渲染。

4

我的自定义标签:

# app/templatetags/ctags.py

def getgenre():
    genre = ["Test1", "Test2"]
    return genre

register.simple_tag(getgenre)

我的html:

# app/templates/base.html

{% load ctags %}
<!-- {% getgenre %} -->
{% for genre in getgenre %}
    <li>{{genre}}</li>
{% endfor %}

这对我来说是一个空白页面。 如果我取消注释{% getgenre %},django会如预期地呈现["Test1", "Test2"]。 我尝试了无数种设置标签的方式(包括非simple_tag的方式),但都没有成功。我无法迭代任何由我的自定义标签返回的值。我是否漏掉了一些基本的东西?

可能与以下内容有关: http://stackoverflow.com/questions/9860717/problems-with-simple-tag-array-values-in-django-template - MoorzTech
3个回答

8
你应该使用assignment_tag而不是simple_tag:
@register.assignment_tag
def getgenre():
    genre = ["Test1", "Test2"]
    return genre

然后在模板中:

{% load ctags %}
{% getgenre as genre_list %}
{% for genre in genre_list %}
    <li>{{genre}}</li>
{% endfor %}

1
可以工作了!太棒了,谢谢...应该把文档读到最后 -.- 虽然我认为他们本可以提到simple_tag的限制...在simple_tag部分没有找到任何相关信息。 - MoorzTech
谢谢!我也在尝试使用 simple_tags,因为文档上说 assignment_tags 自 1.9 版本起已经弃用了,但是我无法让它们正常工作,而你的解决方案可以! - Sebastián Vansteenkiste

3

在任何应用程序的base.py中编写自定义标签

from django import template
register = template.Library()
@register.inclusion_tag('templte/genre.html')
def getgenre():
    genre = ["Test1", "Test2"]
    return genre

然后是模板genre.html。
{% load ctags %}
{% for genre in genre_list %}
    <li>{{genre}}</li>
{% endfor %}

很抱歉,这对我来说不起作用。将 genre_list 更改为 getgenre 或使用 {% getgenre as genre_list %} 也无效。 - MoorzTech
1
{% getgenre as genre_list %} - django-renjith
我的Django自定义模板标签编码方式是,我在任何应用程序的templatetags文件夹中创建一个文件夹,然后创建一个base.py(它适用于所有自定义标签),在这里我编写所有标签,然后我在templates文件夹中创建一个tag文件夹,在那里我创建一个HTML页面并进行编码。之后,我只需在base.html [template文件夹中的主模板]中加载base,然后将模板标签函数名称包含在模板中。希望您理解。 - django-renjith

1

@register.assignment_tag 在Django >= 1.9版本之后已被删除。就像链接中所说的那样,"simple_tag()助手已经获得了相同的功能"。但是,在我的情况下,它不能与for循环一起使用。

因此,可以使用register.filter装饰器(参考),而不是register.simple_tag

@register.filter
def getgenre(arg=None):
    genre = ["Test1", "Test2"]
    return genre

在模板(.html)中:
{% load ctags %}
{% for genre in ""|genre_list %}
    <li>{{genre}}</li>
{% endfor %}

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