如何在Django模板中区分列表和字符串
我正在开发一个项目,使用的是Google AppEngine和Django模板,所以我需要用像{{ aitem.Author }}
这样的标签来在我的HTML模板中显示内容。
不过,Author
这个内容可能是一个字符串,也可能是一个列表对象,而我事先无法判断它是哪种情况。当Author是一个列表时,我在模板中打印出来的结果就会很难看,像这样:
作者: [u'J. K. Rowling', u'Mary GrandPr\xe9']
有没有什么办法可以有效地处理这种情况(基本上就是根据类型不同以不同的方式打印字段)?我是否需要依赖自定义标签或其他方法呢?
3 个回答
0
我按照Matthew的建议,最终实现了一个过滤器来处理列表。我把它放在这里,以防其他人也需要用到。
@register.filter(name='fixlist')
def fixlist(author):
if type(author) == list:
return ', '.join(author)
else:
return author
我在模板页面中这样调用它:{{ aitem.Author|fixlist }}
谢谢大家的帮助!
1
我觉得Aidas的get_authors()
这个解决方案是最好的,不过还有一个替代方法,就是创建一个模板标签来进行测试。你可以去看看自定义模板标签的相关内容,其实创建这些标签并不难,只要看看现有的标签就能明白了。
7
我觉得最简单的解决办法是给模型添加一个方法,叫做 get_authors()
,这个方法总是返回一个作者的列表,可能是一个或多个作者。这样你就可以使用:
Author: {{ aitem.get_authors|join:", " }}
如果你出于某种原因只能访问模板,不能修改模型,那么你可以用一种小技巧来解决这个问题:
{% if "[" == aitem.Author|pprint|slice:":1" %}
Author: {{ aitem.Author|join:", " }}
{% else %}
Author: {{ aitem.Author }}
{% endif %}
顺便说一下,属性名称用大写字母不是一个好的习惯。