जवाबों:
मैंने एक सरल तकनीक का उपयोग किया है जो छोटे मामलों के लिए अच्छी तरह से काम करती है जिसमें कोई विशेष टैग नहीं है और कोई अतिरिक्त संदर्भ नहीं है। कभी-कभी यह काम आता है
{% 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 %}
इस मुद्दे पर मेरी राय है, मुझे लगता है कि सबसे अच्छा है। मैं templatetags निर्देशिका पर my_filters.py रखता हूं।
@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 []
:। इस तरह यह कभी भी एक त्रुटि नहीं उठाता है और एक खाली सरणी देता है (इसी तरह से सबसे अधिक कार्य करता है)।
शायद इस तरह?
{% for i in "x"|rjust:"100" %}
...
{% endfor %}
आप एक बाध्यकारी पास कर सकते हैं
{'n' : range(n) }
टेम्पलेट के लिए, फिर करते हैं
{% for i in n %}
...
{% endfor %}
ध्यान दें कि आपको 0-आधारित व्यवहार (0, 1, ... n-1) मिलेगा।
(पायथन 3 संगतता के लिए अद्यतन)
range(n)
अजगर 3 में, अगर मैं इसे सही ढंग से याद है, xrange उस पर पदावनत किया गया था
आप n
स्वयं को पास नहीं करते हैं , बल्कि range(n)
[0 से n-1 में पूर्णांकों की सूची], आपके विचार से आपके टेम्पलेट तक, और बाद में आप करते हैं {% for i in therange %}
(यदि आप सामान्य 0 के बजाय 1-आधारित पर जोर देते हैं -बेड इंडेक्स का उपयोग आप forloop.counter
लूप के बॉडी में ;-) कर सकते हैं ।
बस किसी और को इस सवाल पर उकसाओ ... मैंने एक टेम्पलेट टैग बनाया है जो आपको एक बनाने देता है range(...)
: http://www.djangosnippets.org/snippets/1926/
'रेंज' बिलिन के रूप में एक ही तर्क स्वीकार करता है और एक सूची युक्त बनाता है 'रेंज' का परिणाम है। वाक्य - विन्यास: {% mkrange [शुरू,] रोक [, कदम] को reference_name%} उदाहरण के लिए: {% mkrange 5 10 2 के रूप में some_range%} {% के लिए मैं some_range%} में {{i}}: कुछ मैं \ n दोहराना चाहता हूँ {% अंतिम%} पैदा करता है: 5: कुछ मैं दोहराना चाहता हूं 7: कुछ मैं दोहराना चाहता हूं 9: कुछ मैं दोहराना चाहता हूं
मैंने इस प्रश्न पर बहुत कोशिश की, और मुझे यहाँ सबसे अच्छा उत्तर मिला: ( django टेम्पलेट्स में 7 बार लूप कैसे करें )
तुम भी आईडी का उपयोग कर सकते हैं!
views.py:
context['loop_times'] = range(1, 8)
एचटीएमएल:
{% for i in loop_times %}
<option value={{ i }}>{{ i }}</option>
{% endfor %}
आप पास कर सकते हैं:
{[n ': श्रेणी (n)}
टेम्पलेट का उपयोग करने के लिए:
{% I में n%} ... {% endfor%}
आपको टेम्पलेट में " स्लाइस " का उपयोग करना चाहिए , इस तरह एक उदाहरण:
विचारों में
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। यह अजगर की रेंज की सुविधा का भी उपयोग करता है, जहां अंत एक कम है इसलिए इसे उदाहरण के लिए सीधे सूची की लंबाई के साथ इस्तेमाल किया जा सकता है।
@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 ) इसके लिए लेकिन निम्न टिप्पणी के साथ "ठीक नहीं होगा" के रूप में बंद हुआ।
इस विचार की मेरी धारणा यह है कि यह टेम्पलेट में प्रोग्रामिंग का नेतृत्व करने की कोशिश कर रहा है। यदि आपके पास उन विकल्पों की एक सूची है, जिन्हें प्रदान करने की आवश्यकता है, तो उन्हें व्यू में गणना की जानी चाहिए, न कि टेम्पलेट में। यदि यह मूल्यों की श्रेणी के रूप में सरल है, तो ऐसा ही हो।
उनके पास एक अच्छा बिंदु है - टेम्पलेट्स को दृश्य के बहुत सरल प्रतिनिधित्व माना जाता है। आपको दृश्य में सीमित आवश्यक डेटा बनाना चाहिए और संदर्भ में टेम्पलेट को पास करना चाहिए।
उन लोगों के लिए जो सरल उत्तर की तलाश कर रहे हैं, बस उन्हें मानों की मात्रा प्रदर्शित करने की आवश्यकता है, उदाहरण के लिए 100 पदों में से 3 को केवल जोड़ दें {% for post in posts|slice:"3" %}
और इसे सामान्य रूप से लूप करें और केवल 3 पद जोड़े जाएंगे।
यदि संख्या एक मॉडल से आ रही है, तो मैंने पाया कि यह मॉडल के लिए एक अच्छा पैच है:
def iterableQuantity(self):
return range(self.quantity)
{% for i in range(10) %}
{{ i }}
{% endfor %}