2010-10-23 60 views
1

我开发在谷歌AppEngine上一个项目,使用Django模板,所以我一定要使用标签,如{{ aitem.Author }}我的HTML模板内打印内容。我怎样才能区分字符串列表在Django模板

Author,但是,可以是一个字符串一个列表对象,我没有办法告诉它提前。当作者是一个列表,我尝试打印在我的模板上,我得到了难看的结果

作者:[u'J。 K.罗琳,u'Mary GrandPr \ xe9' ]

有什么办法来处理这种情况的(基本上是印刷领域不同,这取决于它的类型)有效?我是否必须依靠自定义标签或其他方式?

回答

6

我认为最干净的解决方案将是一个方法添加到模型get_authors()它总是返回的任何一个或多个作者的列表。然后你可以使用:

Author: {{ aitem.get_authors|join:", " }} 

如果由于某种原因,只对模板的访问和无法改变的模式,那么你可以使用这样一个黑客:

{% if "[" == aitem.Author|pprint|slice:":1" %} 
    Author: {{ aitem.Author|join:", " }} 
{% else %} 
    Author: {{ aitem.Author }} 
{% endif %} 

附:将大写字母用于属性名称不是一个好习惯。

+0

你是对的,但不幸的是我不能够修改模型是:我使用了一个库,不能轻易改变的事情。这也解释了这些不良名称的特性。 – abahgat 2010-10-23 15:25:40

+2

而不是'pprint',是不是更好地检查类型特定的方法?例如。 '如果author.islower'只在字符串中评估为true。 – 2010-10-23 15:44:31

+0

好主意。我没有想过这个。 – 2010-10-23 17:05:36

1

我认为回声报的get_authors()解决方案是最好的,但另一种可能是创建一个模板标签,做测试。你需要阅读custom template tags,但如果你看看现有的那些,它们并不难创造。

0

我跟马修的建议,并最终实现了一个过滤器来处理列表。 我在这里发布它,以防万一别人需要它。

@register.filter(name='fixlist') 
def fixlist(author): 
    if type(author) == list: 
     return ', '.join(author) 
    else: 
     return author 

我把它从模板页这样的{{ aitem.Author|fixlist }}

感谢您的帮助!

+1

说'如果isinstance(作者,列表):' – dbn 2015-06-14 08:49:54