回答:
私は、特別なタグや追加のコンテキストがなく、小さなケースでうまく機能する単純な手法を使用しました。時々これは重宝します
{% for i in '0123456789'|make_list %}
{{ forloop.counter }}
{% endfor %}
{% for i in "x"|rjust:"100" %}
{% with ''|center:n as range %}
{% for _ in range %}
{{ forloop.counter }}
{% endfor %}
{% endwith %}
残念ながら、これはDjangoテンプレート言語ではサポートされていません。いくつか の提案がありますが、少し複雑に見えます。私はコンテキストに変数を置くだけです:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
そしてテンプレートで:
{% for i in range %}
...
{% endfor %}
この問題についての私の見解は、私は最も素晴らしいと思います。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 %}
range(1, 16)
、1から始まる番号を取得していない0
from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
次にとして使用され{% for i in 1|range:6 %}{% endfor %}
ます。....以下の完全な答えを参照してください
try: return range(number) except: return []
。これにより、エラーが発生することはなく、空の配列が返されます(ほとんどのテンプレート関数の動作と同様)。
あなたはのバインディングを渡すことができます
{'n' : range(n) }
テンプレートに、次に行います
{% for i in n %}
...
{% endfor %}
0ベースの動作(0、1、... n-1)になることに注意してください。
(Python3互換性のために更新)
range(n)
のpython 3で、私はそれを正しく覚えていれば、はxrangeはそれに廃止されました
あなたはn
自分自身を渡しませんがrange(n)
、ビューからテンプレートに[0からn-1までの整数のリストが含まれる]と渡します。後者の場合は{% for i in therange %}
(通常の0ではなく1ベースを絶対に主張する場合) - forloop.counter
ループの本体で使用できるベースのインデックス;-)。
他の誰かがこの質問に出くわした場合に備えて…を作成できるテンプレートタグを作成しましたrange(...)
:http : //www.djangosnippets.org/snippets/1926/
組み込みの「範囲」と同じ引数を受け入れ、以下を含むリストを作成します 「範囲」の結果。 構文: {%mkrange [start、] stop [、step] as context_name%} 例えば: {%mkrange 5 10 2 as some_range%} {some_range%のi%for i} {{i}}:繰り返したいこと\ n {%forfor%} 生成する: 5:繰り返したいこと 7:繰り返したいこと 9:繰り返したいこと
私はこの質問に一生懸命努力し、ここで最良の答えを見つけました:(djangoテンプレートで7回ループする方法から)
idxにアクセスすることもできます。
views.py:
context['loop_times'] = range(1, 8)
html:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
あなたは渡すことができます:
{'n':range(n)}
テンプレートを使用するには:
{%for i in n%} ... {%endfor%}
次のような例では、テンプレートで「スライス」を使用する必要があります。
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>
このメソッドは、標準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>
for value in 0|range:"10,2"
。あなたは次のようにコードを変更する必要がありますargs = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
私は人気のある答えをもう少し先に進め、より堅牢にします。これにより、任意の開始点を指定できるため、たとえば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を実行できます。ステップを追加するには、テンプレートタグが必要です。これにより、より多くのユースケースがカバーされるため、一歩前進です。
これには基本的にrange
関数が必要です。このためにDjango機能チケットが生成されました(https://code.djangoproject.com/ticket/13088)が、次のコメントで「修正されない」として閉じられました。
このアイデアの私の印象は、それがテンプレートでのプログラミングにつながることを試みているということです。レンダリングする必要があるオプションのリストがある場合は、テンプレートではなくビューで計算する必要があります。それが値の範囲と同じくらい単純であれば、それもそうです。
彼らは良い点を持っています-テンプレートはビューの非常に単純な表現であることになっています。ビューで限られた必要なデータを作成し、コンテキストでテンプレートに渡す必要があります。
番号がモデルからのものである場合、これはモデルに対する素晴らしいパッチであることがわかりました。
def iterableQuantity(self):
return range(self.quantity)
{% for i in range(10) %}
{{ i }}
{% endfor %}