我觉得我正在写一些应该存在的东西。
Django是否有一个模板过滤器,用于连接逗号和地点上的项目列表以及最后一个项目之前的“和”?
例如:
a = ['foo',]
b = ['bar', 'baz',]
c = a + b
d = c + ['yourmom',]
我正在寻找的过滤器将以下列方式显示每个列表:
a会显示'foo'。
b会显示'bar和baz'。
c会显示'foo,bar和baz'。
d会显示'foo,bar,baz和yourmom'。
问题1:有没有这样做的事情?
我自己试着写这个并且它在两个地方打破了:
我的代码: http://pastie.org/private/fhtvg5tchtwlnrdyuoyeja
问题2:它打破了forloop.counter& tc.author.all |长度。请解释为什么这些无效。
答案 0 :(得分:15)
您可以在模板中执行此操作:
{% for item in list %}
{% if forloop.first %}{% else %}
{% if forloop.last %} and {% else %}, {% endif %}
{% endif %}{{item}}
{% endfor %}
为了清晰起见,添加了换行符:删除它们以避免输出中出现不需要的空格:
{% for item in list %}{% if forloop.first %}{% else %}{% if forloop.last %} and {% else %}, {% endif %}{% endif %}{{item}}{% endfor %}
修改:更改了代码。感谢Eric Fortin让我注意到我很困惑。
答案 1 :(得分:0)
这是我用“最大项目”功能编写的一个:
useserialcomma = True
def listify(values, maxitems=4):
sercomma = ',' if useserialcomma else ''
l = len(values)
if l == 0:
return ''
elif l == 1:
return values[0]
elif l == 2:
return values[0] + ' and ' + values[1]
elif l <= maxitems:
return ', '.join(values[:l-1]) + sercomma + ' and ' + values[-1]
else:
andmoretxt = ' and %d more' % (l - maxitems)
return ', '.join(values[:maxitems]) + andmoretxt
此过滤器可让您指定要显示的最大项目数。所以,鉴于此清单:
myitems = ['foo', 'bar', 'baz', 'barn', 'feast', 'pizza']
模板中的此代码:
{{ myitems|listify:3 }}
产生
foo, bar, baz and 3 others
答案 2 :(得分:-1)
尝试这样的过滤器(未经测试):
def human_join(values):
out = ', '.join(values[:-1])
if out:
out += ' and '
if values:
out += values[-1]
return out
答案 3 :(得分:-1)
我使用css ::before
和::after
伪类解决了这个问题。我给每个项目item
课程,然后这样做:
.item:not(:last-child)::after{
content: ", ";
}
.item:last-child::before{
content: "and ";
}
.item:last-child::after{
content: ".";
}
这不是一个Django解决方案,但总是很好地激发一大堆想法。