迭代自定义模板标记传递的列表

时间:2015-07-06 11:57:07

标签: django list templates tags

我有自定义模板标记:

@register.simple_tag
def random_num():
    numbers = range(1,18)
    shuffle(numbers)
    return numbers

在模板中:

{% for num in random_num  %}
    {{ num }}
{% endfor %}

什么都没有。 {% random_num %}很好地打印整个列表,但我需要迭代所有元素。有什么问题?

2 个答案:

答案 0 :(得分:4)

您不能将templatetag用作变量,因此:

{% for num in random_num  %}

无法正常工作。

您需要将模板标签更改为assignment tag

@register.assignment_tag
def random_num():
    numbers = range(1,18)
    shuffle(numbers)
    return numbers

...并使用模板中的as子句:

{% random_num as numlist %}
{% for num in numlist  %}
    {{ num }}
{% endfor %}

答案 1 :(得分:1)

根据Anentropic的回答,在Django 2.0中你可以继续使用simple_tag,但你仍然必须使用as子句。 assignment_tag也是,has been deprecated and removed from Django 2.0

因此,您的代码可以是:

@register.simple_tag
def random_num():
    numbers = range(1,18)
    shuffle(numbers)
    return numbers

在模板中,您应该将其用作:

{% random_num as numlist %}
{% for num in numlist  %}
    {{ num }}
{% endfor %}