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

Django は、テンプレートに含まれるすべてのスペースを挿入します。

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

ところで、リストに値が 1 つしか含まれていない場合、テンプレートは間違った出力をレンダリングします。修正されたテンプレートは次のようになります。

{% 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 に答える
1

OK、何度か試行した後、解決策を見つけたと思います。少し冗長ですが、必要なことは実行します-余分なスペースはありません-

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

forloop.revcounterはループの終わりからカウントダウンしているので、最後から 2 番目の項目に「and」を追加し、最後の項目には何も入力しません。

于 2013-02-14T19:07:03.623 に答える