Django自定义模板标记未在循环中呈现

时间:2015-01-16 02:43:13

标签: python django django-templates

我的自定义标记:

# 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会按预期呈现[&#34; Test1&#34;,&#34; Test2&#34;]。 我尝试了无数种设置我的标签(包括非simple_tag方式)的变种无济于事。我无法迭代我的一个自定义标记返回的任何值。

我错过了一些基本的东西吗?

3 个答案:

答案 0 :(得分:7)

您应该使用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 :(得分:2)

自定义标记在任何应用中的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 %}

答案 2 :(得分:0)

@register.assignment_tag has been removed after Django >= 1.9。就像 link simple_tag() 助手获得了同样的能力” 中所说的那样。是的,但至少在我的情况下不适用于 for 循环。

register.simple_tag 的 Instad 使用 register.filter 装饰器 (reference)

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

在模板(.html)中:

{% load ctags %}
{% for genre in ""|genre_list %}
    <li>{{genre}}</li>
{% endfor %}