Django 自定义模板标签未在循环中呈现
Django custom template-tag not rendered in loop
我的自定义标签:
# 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"]。
我尝试了无数种设置标签的方法(包括 non-simple_tag 方式),但都无济于事。我根本无法迭代我的自定义标签之一返回的任何值。
我是不是漏掉了一些基本的东西?
您应该使用 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 %}
自定义标签写入 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 %}
As @register.assignment_tag
has been removed after Django >= 1.9. And like said in the link “simple_tag()
帮助者获得了同样的能力”。是的,但至少在我的情况下不适用于 for 循环。
Instad register.simple_tag
使用 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 %}
我的自定义标签:
# 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"]。 我尝试了无数种设置标签的方法(包括 non-simple_tag 方式),但都无济于事。我根本无法迭代我的自定义标签之一返回的任何值。
我是不是漏掉了一些基本的东西?
您应该使用 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 %}
自定义标签写入 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 %}
As @register.assignment_tag
has been removed after Django >= 1.9. And like said in the link “simple_tag()
帮助者获得了同样的能力”。是的,但至少在我的情况下不适用于 for 循环。
Instad register.simple_tag
使用 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 %}