逗号分隔django模板中的列表

如果fruits['apples', 'oranges', 'pears']

有没有使用Django模板标签生产“苹果,橘子和梨”的快速方法?

我知道用循环和{% if counter.last %}语句来做这件事并不困难,但是因为我要反复使用它,我想我将不得不学习如何编写自定义 标签 filter,我不想重新发明轮子,如果它已经完成。

作为延伸,我放弃牛津逗号 (即“苹果,橘子和梨”)的尝试更加混乱。

我会build议一个自定义的Django模板filter,而不是自定义标签 – filter更容易,更简单(在适当的地方,就像这里)。 {{ fruits | joinby:", " }} {{ fruits | joinby:", " }}看起来像我想要的目的…自定义的joinbyfilter:

 def joinby(value, arg): return arg.join(value) 

正如你所看到的是简单本身!

首选:使用现有的连接模板标签。

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#join

这是他们的例子

 {{ value|join:" // " }} 

第二select:在视图中进行。

 fruits_text = ", ".join( fruits ) 

fruits_text提供给模板进行渲染。

这是一个超级简单的解决scheme。 把这段代码放到comma.html中:

 {% if not forloop.last %}{% ifequal forloop.revcounter 2 %} and {% else %}, {% endifequal %}{% else %}{% endif %} 

现在,无论您将逗号放在哪里,都应该包含“comma.html”

 {% for cat in cats %} Kitty {{cat.name}}{% include "comma.html" %} {% endfor %} 

在Django模板上,这是您每次完成后都需要build立一个逗号的function。 一旦达到最后的果实,逗号将停止。

 {% if not forloop.last %}, {% endif %} 

这是我写的解决我的问题的filter:

 def join_with_commas(obj_list): """Takes a list of objects and returns their unicode representations, seperated by commas and with 'and' between the penultimate and final items For example, for a list of fruit objects: [<Fruit: apples>,<Fruit: oranges>,<Fruit: pears>] -> 'apples, oranges and pears' """ if not obj_list: return "" l=len(obj_list) if l==1: return u"%s" % obj_list[0] else: return ", ".join(unicode(obj) for obj in obj_list[:l-1]) \ + " and " + unicode(obj_list[l-1]) 

要在模板中使用它: {{ fruits | join_with_commas }} {{ fruits | join_with_commas }}

如果你想要一个'。' 在迈克尔·马修·托姆姆的回答结束时,然后使用:

 {% if not forloop.last %}{% ifequal forloop.revcounter 2 %} and {% else %}, {% endifequal %}{% else %}{% endif %}{% if forloop.last %}.{% endif %} 

Django不支持这个开箱即用的function。 您可以为此定义一个自定义filter:

 from django import template register = template.Library() @register.filter def join_and(value): """Given a list of strings, format them with commas and spaces, but with 'and' at the end. >>> join_and(['apples', 'oranges', 'pears']) "apples, oranges, and pears" """ # convert numbers to strings value = [str(item) for item in value] if len(value) == 1: return value[0] # join all but the last element all_but_last = ", ".join(value[:-1]) return "%s, and %s" % (all_but_last, value[-1]) 

但是,如果您想要处理比string列表更复杂的事情,则必须在模板中使用明确的{% for x in y %}循环。

如果你喜欢单线:

 @register.filter def lineup(ls): return ', '.join(ls[:-1])+' and '+ls[-1] if len(ls)>1 else ls[0] 

然后在模板中:

 {{ fruits|lineup }}