Django模板过滤器,用于创建以逗号连接并以“和”结尾的项目列表

时间:2010-08-04 23:47:14

标签: django django-templates

我觉得我正在写一些应该存在的东西。

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 |长度。请解释为什么这些无效。

4 个答案:

答案 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解决方案,但总是很好地激发一大堆想法。