Yanıtlar:
Özel etiketleri ve ek bağlamı olmayan küçük durumlar için güzel çalışan basit bir teknik kullandım. Bazen bu işe yarar
{% 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 %}
Ne yazık ki, bu Django şablon dilinde desteklenmiyor . Orada bir olan çift arasında önerileri , ama onlar biraz karmaşık görünüyor. Ben sadece bağlamda bir değişken koymak istiyorum:
...
render_to_response('foo.html', {..., 'range': range(10), ...}, ...)
...
ve şablonda:
{% for i in range %}
...
{% endfor %}
Bu konuda benim almak, en güzel olduğunu düşünüyorum. Şablon etiketleri dizininde bir my_filters.py saklıyorum.
@register.filter(name='times')
def times(number):
return range(number)
Ve şöyle kullanırsınız:
{% load my_filters %}
{% for i in 15|times %}
<li>Item</li>
{% endfor %}
range(1, 16)
0'dan değil, 1'den başlayan numaraları almak için yapın .
from django.template import Library;register = Library()
@register.filter(name='range') def filter_range(start, end): return range(start, end)
Sonra olarak kullanılır {% for i in 1|range:6 %}{% endfor %}
. Aşağıdaki tam cevabı görün ....
try: return range(number) except: return []
. Bu şekilde hiçbir zaman hata oluşturmaz ve boş bir dizi döndürür (çoğu şablon işlevinin çalışma biçimine benzer).
Belki böyle mi?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
Bir ciltleme geçebilirsiniz
{'n' : range(n) }
şablona gidin, sonra yapın
{% for i in n %}
...
{% endfor %}
0 tabanlı davranış (0, 1, ... n-1) elde edeceğinizi unutmayın.
(Python3 uyumluluğu için güncellendi)
range(n)
Python 3'te kullanın , doğru hatırlıyorsam, xrange üzerinde kullanımdan kaldırıldı
Kendi başınıza değil n
, daha ziyade range(n)
[0'dan n-1'e kadar tamsayıların listesi], görünümünüzden şablonunuza ve sonrakinde {% for i in therange %}
(normal 0 yerine 1 tabanlı olarak ısrar ediyorsanız) forloop.counter
döngüsünün gövdesinde kullanabileceğiniz temelli dizin ;-).
Başka Sadece örtmek herkes bu soruya rastlar ... Sana bir oluşturmanıza olanak sağlayan bir şablon etiket oluşturdunuz range(...)
: http://www.djangosnippets.org/snippets/1926/
'Range' yerleşimi ile aynı argümanları kabul eder ve aşağıdakileri içeren bir liste oluşturur 'aralık' sonucu. Sözdizimi: {% mkrange [start,] stop [, step], bağlam_adı%} Örneğin: {% mkrange 5 10 2, bazı_aralık% olarak} {some_range% içindeki i için%%} {{i}}: Tekrarlamak istediğim bir şey \ n {% endfor%} üretir: 5: Tekrarlamak istediğim bir şey 7: Tekrarlamak istediğim bir şey 9: Tekrarlamak istediğim bir şey
Bu soru üzerinde çok çalıştım ve burada en iyi cevabı buluyorum: ( django şablonlarında 7 kez döngüden )
İdx'e bile erişebilirsiniz!
views.py:
context['loop_times'] = range(1, 8)
html:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
Geçebilirsin :
{'n': aralık (n)}
Şablonu kullanmak için:
{% n içinde i için%%} ... {% endfor%}
" Dilim "Şablonda " , şöyle bir örnek:
views.py içinde
contexts = {
'ALL_STORES': Store.objects.all(),
}
return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor]))
store_list.html dosyasında:
<ul>
{% for store in ALL_STORES|slice:":10" %}
<li class="store_item">{{ store.name }}</li>
{% endfor %}
</ul>
Bu yöntem standart range([start,] stop[, step])
işlevin tüm işlevlerini destekler
<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)
Kullanımı:
{% 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>
Çıktı
<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"
. Kodunuzu aşağıdaki gibi değiştirmeniz gerekir:args = filter(lambda x: isinstance(x, int) and x >= 0, (_min, _max, _step))
Popüler yanıtı biraz daha ileriye götürüyorum ve daha sağlam hale getiriyorum. Bu, herhangi bir başlangıç noktası belirtmenize izin verir, örneğin 0 veya 1. Ayrıca, örneğin liste uzunlukları ile doğrudan kullanılabilmesi için sonun daha az olduğu python aralık özelliğini de kullanır.
@register.filter(name='range')
def filter_range(start, end):
return range(start, end)
Ardından, şablonunuza yukarıdaki şablon etiketi dosyasını ekleyin ve aşağıdakileri kullanın:
{% for c in 1|range:6 %}
{{ c }}
{% endfor %}
Şimdi sadece 0-6 yerine 1-6 veya sert kodlama yapabilirsiniz. Bir adım eklemek bir şablon etiketi gerektirir; bu, daha fazla kullanım durumunu kapsaması için ileriye doğru bir adımdır.
Bu aslında bir range
işlev gerektirir . Bunun için bir Django özellik bileti ( https://code.djangoproject.com/ticket/13088 ) oluşturuldu, ancak aşağıdaki yorumla "düzeltilmeyecek" şeklinde kapatıldı.
Bu fikir hakkındaki izlenimim, şablonda programlamaya yol açmaya çalıştığıdır. Oluşturulması gereken seçeneklerin bir listeniz varsa, bunlar şablonda değil görünümde hesaplanmalıdır. Bu bir değer aralığı kadar basitse, öyle olsun.
İyi bir noktaya sahipler - Şablonların manzaranın çok basit bir temsili olması gerekiyor. Görünümde gerekli olan sınırlı verileri oluşturmanız ve bağlam içindeki şablona iletmeniz gerekir.
Basit bir cevap arayanlar için, sadece bir miktar değer göstermesi gerekenler için, örneğin 100 mesajdan 3'ü sadece {% for post in posts|slice:"3" %}
normal şekilde ekleyin ve döngüye sokun ve sadece 3 mesaj ekleyelim .
Sayı bir modelden geliyorsa, bunu modele hoş bir yama olarak buldum:
def iterableQuantity(self):
return range(self.quantity)
{% for i in range(10) %}
{{ i }}
{% endfor %}