逗号分隔django模板中的列表
如果fruits
是['apples', 'oranges', 'pears']
有没有使用Django模板标签生产“苹果,橘子和梨”的快速方法?
我知道用循环和{% if counter.last %}
语句来做这件事并不困难,但是因为我要反复使用它,我想我将不得不学习如何编写自定义 标签 filter,我不想重新发明轮子,如果它已经完成。
作为延伸,我放弃牛津逗号 (即“苹果,橘子和梨”)的尝试更加混乱。
我会build议一个自定义的Django模板filter,而不是自定义标签 – filter更容易,更简单(在适当的地方,就像这里)。 {{ fruits | joinby:", " }}
{{ fruits | joinby:", " }}
看起来像我想要的目的…自定义的joinby
filter:
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 }}