1

我正在使用以下模板代码尝试生成格式为“a、b、c 和 d”的列表:

{% for item in list %}
  {% if not forloop.first %}
    {% if not forloop.last %}
      ,
    {% endif %}
  {% endif %}
  {% if forloop.last %}
    and
  {% endif %}
  {{ item }}
{% endfor %}

我得到的实际输出是 'a 、 b 、 c 和 d' (注意逗号前的空格)。

发生了什么事,我该如何解决?

4

3 回答 3

1

好的,经过几次尝试,我想我找到了一个解决方案,它有点冗长,但它可以满足您的需求 - 没有额外的空格 -

{% for item in list %}
    {% if forloop.revcounter > 2 %}
        {{ item }},
    {% else %}
         {% if forloop.revcounter == 2 %}
              {{ item }} and
         {% else %}
              {{ item }}
         {% endif %}
    {% endif %}
{% endfor %}

forloop.revcounter正在从循环的末尾倒计时,因此您将“和”添加到倒数第二个项目中,而最后一项则没有任何内容。

于 2013-02-14T19:07:03.623 回答
1

Django 插入模板包含的所有空格:

{% for item in list %}{% if not forloop.first %}{% if not forloop.last %}, {% endif %}{% endif %}{% if forloop.last %} and {% endif %}{{ item }}{% endfor %}

顺便说一句,如果列表仅包含一个值,您的模板会呈现错误的输出。更正后的模板如下所示:

{% for item in list %}
    {% if not forloop.first %}
        {% if forloop.last %}
            and
        {% else %}
            ,
        {% endif %}
    {% endif %}
    {{ item }}
{% endfor %}

如果没有多余的空间,它会变成:

{% for item in list %}{% if not forloop.first %}{% if forloop.last %} and {% else %}, {% endif %}{% endif %}{{ item }}{% endfor %}
于 2013-02-14T19:17:30.630 回答
1

我会做一个简单的模板过滤器

@register.filter
def format_list(li):
    """
    Return the list as a string in human readable format.

    >>> format_list([''])
    ''
    >>> format_list(['a'])
    'a'
    >>> format_list(['a', 'b'])
    'a and b'
    >>> format_list(['a', 'b', 'c'])
    'a, b and c'
    >>> format_list(['a', 'b', 'c', 'd'])
    'a, b, c and d'
    """
    if not li:
        return ''
    elif len(li) == 1:
        return li[0]
    return '%s and %s' % (', '.join(li[:-1]), li[-1])

我远非 python 专家,可能有更好的方法来做到这一点。但是,这在“django 级别”似乎很干净,这样使用它:

{{ your_list|format_list }}

我喜欢这个解决方案的地方在于它是可重用的,更具可读性,代码更少,并且有测试。

查看有关编写模板过滤器的文档以获取有关如何安装它的详细信息。

此外,您可能会注意到此功能附带 doctests,请参阅django 文档以了解如何运行测试。

这里有一个方法:

>>> python -m doctest form.py -v
Trying:
    format_list([''])
Expecting:
    ''
ok
Trying:
    format_list(['a'])
Expecting:
    'a'
ok
Trying:
    format_list(['a', 'b'])
Expecting:
    'a and b'
ok
Trying:
    format_list(['a', 'b', 'c'])
Expecting:
    'a, b and c'
ok
Trying:
    format_list(['a', 'b', 'c', 'd'])
Expecting:
    'a, b, c and d'
ok
1 items had no tests:
    form
1 items passed all tests:
   5 tests in form.format_list
5 tests in 2 items.
5 passed and 0 failed.
Test passed.
于 2013-02-14T19:43:39.873 回答