如何区分 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 模板中的列表和字符串的主要内容,如果未能解决你的问题,请参考以下文章

遍历字符串和列表的 Python/Django 模板

如何判断一个值是 Django 模板中的字符串还是列表?

如何过滤django模板中的特殊字符

如何区分 Django 模板中的继承模型?

如何在 Django 模板中访问字典列表

Django模板 - 查找列表中的至少一项是不是出现在其他列表中