web-dev-qa-db-ja.com

Djangoテンプレートのforループの数値

Djangoテンプレートに数値のforループを書き込むにはどうすればよいですか?私は次のようなものを意味します

for i = 1 to n
219
Lev

特別なタグや追加のコンテキストがない小規模なケースでうまく機能する単純な手法を使用しました。時々これは重宝します

{% for i in i|rjust:20 %}
    {{ forloop.counter }}
{% endfor %}
355
Udi

残念ながら、Djangoテンプレート言語では サポートされていません です。 couple of suggestions がありますが、少し複雑に見えます。コンテキストに変数を入れるだけです。

...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...

そしてテンプレートで:

{% for i in range %}
     ...
{% endfor %}
94
tghw
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}
90

この問題についての私の意見は、私が最もいいと思う。 my_filters.pyをtemplatetagsディレクトリに保存します。

@register.filter(name='times') 
def times(number):
    return range(number)

そして、あなたは次のように使用します:

{% load my_filters %}
{% for i in 15|times %}
    <li>Item</li>
{% endfor %}

たぶんこんな感じ?

{% for i in "x"|rjust:"100" %}
...
{% endfor %}
35
CruelSilence

のバインディングを渡すことができます

{'n' : range(n) }

テンプレートに

{% for i in n %}
...
{% endfor %}

0ベースの動作(0、1、... n-1)が得られることに注意してください。

(Python3との互換性のために更新されました)

30
Dave W. Smith

n自体を渡すのではなく、ビューからテンプレートにrange(n) [0〜n-1の整数のリストを含む]を渡し、後者では{% for i in therange %}を実行します(1ベースではなく1ループの本体でforloop.counterを使用できる通常の0ベースのインデックス;-)。

9
Alex Martelli

他の誰かがこの質問に出くわす場合に備えて... range(...)を作成できるテンプレートタグを作成しました: http://www.djangosnippets.org/snippets/1926/

組み込みの 'range'と同じ引数を受け入れ、
 'range'の結果を含むリストを作成します。
 
 Syntax:
 { %mkrange [start、] stop [、step] as context_name%} 
 
たとえば:
 {%mkrange 5 10 2 as some_range%} 
 {% for i in some_range%} 
 {{i}}:繰り返したいもの\ n​​ 
 {%endfor%} 
 
 Produces:
 5:繰り返したいもの
 7:繰り返したいもの
 9:繰り返したいもの
 
9
David Wolever

私はこの質問に一生懸命挑戦し、ここで最良の答えを見つけました:( Django_テンプレートで7回ループする方法

Idxにもアクセスできます!

views.py:

context['loop_times'] = range(1, 8)

html:

{% for i in loop_times %}
        <option value={{ i }}>{{ i }}</option>
{% endfor %}
6
KKlalala

このメソッドは、標準のrange([start,] stop[, step])関数のすべての機能をサポートします

<app>/templatetags/range.py

from Django import template

register = template.Library()


@register.filter(name='range')
def _range(_min, args=None):
    _max, _step = None, None
    if args:
        if not isinstance(args, int):
            _max, _step = map(int, args.split(','))
        else:
            _max = args
    args = filter(None, (_min, _max, _step))
    return range(*args)

使用法:

{% load range %}

<p>stop 5
{% for value in 5|range %}
{{ value }}
{% endfor %}
</p>

<p>start 5 stop 10
{% for value in 5|range:10 %}
{{ value }}
{% endfor %}
</p>

<p>start 5 stop 10 step 2
{% for value in 5|range:"10,2" %}
{{ value }}
{% endfor %}
</p>

出力

<p>stop 5
0 1 2 3 4
</p>

<p>start 5 stop 10
5 6 7 8 9
</p>

<p>start 5 stop 10 step 2
5 7 9
</p>
6
Rebs

次のような例では、テンプレートで「 slice 」を使用する必要があります。

views.pyで

contexts = {
    'ALL_STORES': Store.objects.all(),
}

return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))

store_list.html:

<ul>
{% for store in ALL_STORES|slice:":10" %}
    <li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
6
Vinta

人気のある答えをもう少し取り上げて、より堅牢にしています。これにより、任意の開始点を指定できるため、たとえば0または1を指定できます。また、末尾が1つ少ないPythonの範囲機能を使用しているため、たとえばリストの長さで直接使用できます。

@register.filter(name='range')
def filter_range(start, end):
  return range(start, end)

次に、テンプレートに上記のテンプレートタグファイルを含めるだけで、次を使用します。

{% for c in 1|range:6 %}
{{ c }}
{% endfor %}

これで、0〜6またはハードコーディングする代わりに1〜6を実行できます。ステップを追加するにはテンプレートタグが必要です。これはより多くのユースケースをカバーするはずなので、一歩前進です。

4
Paul Kenjora

使用できます:{% with ''|center: i as range %}

4
rkoots

これには基本的にrange関数が必要です。このためDjango機能チケットが発生しました( https://code.djangoproject.com/ticket/13088 )が、次のコメントで「修正されない」としてクローズされました。

このアイデアに対する私の印象は、テンプレートでのプログラミングにつながることです。レンダリングする必要があるオプションのリストがある場合は、テンプレートではなくビューで計算する必要があります。値の範囲と同じくらい簡単な場合は、そうしてください。

良い点があります-テンプレートはビューの非常に単純な表現であると想定されています。ビューで制限された必要なデータを作成し、コンテキストでテンプレートに渡す必要があります。

3

渡すことができます:

{'n':range(n)}

テンプレートを使用するには:

{%for i in n%} ... {%endfor%}

1
rkoots

番号がモデルからのものである場合、私はこれがモデルへの素敵なパッチであることがわかりました:

def iterableQuantity(self):
    return range(self.quantity)
0
Alper