如何区分 Django 模板中的列表和字符串
Posted
技术标签:
【中文标题】如何区分 Django 模板中的列表和字符串【英文标题】:How can I distinguish lists from strings in django templates 【发布时间】:2011-04-29 10:39:58 【问题描述】:我正在使用 Django 模板在 Google AppEngine 上开发一个项目,因此我必须使用 aitem.Author
之类的标签来打印我的 html 模板中的内容。
Author
既可以是string 也可以是list 对象,我无法提前告诉它。当作者是一个列表并且我尝试在我的模板上打印它时,我得到了
作者:[u'J. K. Rowling', u'Mary GrandPr\xe9']
有什么方法可以有效地处理这种情况(基本上根据其类型打印不同的字段)?我必须依赖自定义标签或任何其他方式吗?
【问题讨论】:
【参考方案1】:我听从了 Matthew 的建议,最终实现了一个过滤器来处理列表。 我把它贴在这里以防其他人需要它。
@register.filter(name='fixlist')
def fixlist(author):
if type(author) == list:
return ', '.join(author)
else:
return author
我从这样的模板页面调用它 aitem.Author|fixlist
感谢您的帮助!
【讨论】:
说if isinstance(author, list):
可能比较时髦【参考方案2】:
我认为 Aidas 的 get_authors()
解决方案是最好的,但另一种方法可能是创建一个模板标签来进行测试。你会想阅读custom template tags,但如果你看看现有的,它们并不难创建。
【讨论】:
【参考方案3】:我认为最干净的解决方案是向模型get_authors()
添加一个方法,该方法总是返回一个或多个作者的列表。然后你可以使用:
Author: aitem.get_authors|join:", "
如果您出于某种原因只能访问模板而无法更改模型,那么您可以使用这样的 hack:
% if "[" == aitem.Author|pprint|slice:":1" %
Author: aitem.Author|join:", "
% else %
Author: aitem.Author
% endif %
附:对属性名称使用大写字母不是一个好的约定。
【讨论】:
你是对的,但不幸的是我无法为此修改模型:我正在使用一个库并且不能轻易改变那个东西。这也解释了命名不当的属性。 而不是pprint
,检查特定类型的方法不是更好吗?例如。 if author.islower
仅在 string 时才评估 true。
好主意。我还没想过。以上是关于如何区分 Django 模板中的列表和字符串的主要内容,如果未能解决你的问题,请参考以下文章