Django टेम्प्लेट में लूप के लिए संख्यात्मक


261

मैं forएक Django टेम्पलेट में एक संख्यात्मक लूप कैसे लिखूं ? मेरा मतलब कुछ ऐसा है

for i = 1 to n

जवाबों:


392

मैंने एक सरल तकनीक का उपयोग किया है जो छोटे मामलों के लिए अच्छी तरह से काम करती है जिसमें कोई विशेष टैग नहीं है और कोई अतिरिक्त संदर्भ नहीं है। कभी-कभी यह काम आता है

{% for i in '0123456789'|make_list %}
    {{ forloop.counter }}
{% endfor %}

9
एफडब्ल्यूआईडब्ल्यू, 012 == 12, इसलिए यह केवल 1 और 2 से अधिक लूप करेगा
जैसन

22
{0123456789 में I के लिए%। make_list%} सभी 10 पर पुनरावृत्ति करने के लिए, लंघन नहीं 0.
रिक

7
'रूल' के साथ मनमानी लंबाई की एक स्ट्रिंग उत्पन्न करें{% for i in "x"|rjust:"100" %}
एरोन

27
तीसरी बार, यह उत्तर आईएसएडी है । इसका उपयोग न करें। टेम्प्लेट टैग का उपयोग करें और इसे ठीक से करें। मैं यह देखने में विफल रहता हूं कि एक उत्तर को बुरा कैसे कहा जा सकता है, यह एक टिप्पणी को हटाने के लिए पर्याप्त है।
रीब

6
@Rebs इसके साथ इतना बुरा क्या है? निश्चित रूप से यह हैकिंग है, लेकिन एक टेम्प्लेट टैग को सिर्फ इसलिए जोड़ना क्योंकि आपको किसी प्रोजेक्ट में एक समय के लिए एक छोटी सी सीमा पर लूप करने की आवश्यकता होती है, ऐसा कोई महान समाधान भी नहीं है।
tobltobs

114
{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}

9
बहुत बढ़िया जवाब। काम करता है क्योंकि केंद्र एन रिक्त स्थान की एक स्ट्रिंग बनाता है जो तब लूप किए जाते हैं। प्रत्येक अंतरिक्ष चार को तब नजरअंदाज कर दिया जाता है, लेकिन सीमा में वर्तमान मूल्य forloop.counter (या forloop.counter0) से पाया जा सकता है। Docs.djangoproject.com/en/dev/ref/templates/builtins/#center
isedwards

2
बहुत बढ़िया जवाब! नया फ़िल्टर नहीं बनाना था।
मिगुएल इके

देखने में कुछ करने की जरूरत नहीं। उत्कृष्ट हैक
मोहम्मद शरीफ सी

106

दुर्भाग्य से, यह Django टेम्पलेट भाषा में समर्थित नहीं है । वहाँ एक हैं जोड़ी का सुझाव है, लेकिन वे एक छोटे से जटिल लगते हैं। मैं सिर्फ संदर्भ में एक चर डालूंगा:

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

और टेम्पलेट में:

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

13
Django के लेखकों की प्रेरणाओं को सादा अजगर को टेम्पलेट्स में बंद करने के लिए दर्द की तुलना में व्यर्थ और असंगत लगता है और इसे न करने के लिए काम करने में समय गंवाना पड़ता है, एक पूरी तरह से भयानक एक (अजगर) जब एक पूरी तरह से नए लंगोट का आविष्कार करने की आवश्यकता का उल्लेख नहीं है! ) पहले से ही वहीं है!
बोगाटियर

2
: @Bogatyr तो यह है कि आप क्या चाहते हैं, बस का उपयोग Jinja2 docs.djangoproject.com/en/1.9/topics/templates/...
tghw

78

इस मुद्दे पर मेरी राय है, मुझे लगता है कि सबसे अच्छा है। मैं 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 %}

1
मुझे लगता है कि यह सही समाधान है। range(1, 16)नंबर 1 से शुरू करने के लिए करें , न कि 0.
छांटील

Templatetags निर्देशिका में एक खाली फ़ाइल _ init _.py बनाएँ। इन रेखाओं को my_filters.py from django.template import Library;register = Library()
Ajeeb.KP

एक दूसरा फिल्टर पैरामीटर जोड़ें और आपको अजगर में निर्मित पूर्ण रेंज फ़ंक्शन मिलता है। @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 []:। इस तरह यह कभी भी एक त्रुटि नहीं उठाता है और एक खाली सरणी देता है (इसी तरह से सबसे अधिक कार्य करता है)।
टिम टिस्डल


41

आप एक बाध्यकारी पास कर सकते हैं

{'n' : range(n) }

टेम्पलेट के लिए, फिर करते हैं

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

ध्यान दें कि आपको 0-आधारित व्यवहार (0, 1, ... n-1) मिलेगा।

(पायथन 3 संगतता के लिए अद्यतन)


1
उपयोग range(n)अजगर 3 में, अगर मैं इसे सही ढंग से याद है, xrange उस पर पदावनत किया गया था
Felicio

वास्तव में हाँ। और वह कोड की दो पंक्तियों में से एक था, जिसे मुझे पायथन 3 के लिए एक एप्लिकेशन को बदलने में मौका देना था।
डेव डब्ल्यू स्मिथ

9

आप nस्वयं को पास नहीं करते हैं , बल्कि range(n)[0 से n-1 में पूर्णांकों की सूची], आपके विचार से आपके टेम्पलेट तक, और बाद में आप करते हैं {% for i in therange %}(यदि आप सामान्य 0 के बजाय 1-आधारित पर जोर देते हैं -बेड इंडेक्स का उपयोग आप forloop.counterलूप के बॉडी में ;-) कर सकते हैं ।


9

बस किसी और को इस सवाल पर उकसाओ ... मैंने एक टेम्पलेट टैग बनाया है जो आपको एक बनाने देता है range(...): http://www.djangosnippets.org/snippets/1926/

'रेंज' बिलिन के रूप में एक ही तर्क स्वीकार करता है और एक सूची युक्त बनाता है
'रेंज' का परिणाम है।

वाक्य - विन्यास:
    {% mkrange [शुरू,] रोक [, कदम] को reference_name%}

उदाहरण के लिए:
    {% mkrange 5 10 2 के रूप में some_range%}
    {% के ​​लिए मैं some_range%} में
      {{i}}: कुछ मैं \ n दोहराना चाहता हूँ
    {% अंतिम%}

पैदा करता है:
    5: कुछ मैं दोहराना चाहता हूं 
    7: कुछ मैं दोहराना चाहता हूं 
    9: कुछ मैं दोहराना चाहता हूं


1
-1 एलेक्स पाइ के स्निपेट के पक्ष में जो चर तर्कों का समर्थन करता है।
15:000 बजे m000

9

मैंने इस प्रश्न पर बहुत कोशिश की, और मुझे यहाँ सबसे अच्छा उत्तर मिला: ( django टेम्पलेट्स में 7 बार लूप कैसे करें )

तुम भी आईडी का उपयोग कर सकते हैं!

views.py:

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

एचटीएमएल:

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

9

आप पास कर सकते हैं:

{[n ': श्रेणी (n)}

टेम्पलेट का उपयोग करने के लिए:

{% I में n%} ... {% endfor%}


पठनीय और सरल, यह समझना आसान है कि क्या हो रहा है अगर आप अगले आदमी को कोड बनाए रख रहे हैं
rossdavidh

7

आपको टेम्पलेट में " स्लाइस " का उपयोग करना चाहिए , इस तरह एक उदाहरण:

विचारों में

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>

1
निश्चित नहीं है कि यह वही है जो ओपी देख रहा था, लेकिन यह वही है जो मैं देख रहा था। =)
GChorn

7

यह विधि मानक 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))
Bedilbek

@Bedilbek इस कोड को मानक अजगर रेंज की नकल करता है। यहां तक ​​कि यह स्पष्ट चरण पैरामीटर के बिना नकारात्मक सीमाओं का समर्थन नहीं करता है। >>> सूची (श्रेणी (10,2)) [] >>> सूची (श्रेणी (10,2, -1)) [10, 9, 8, 7, 6, 5, 4, 3]
रीब्स

5

मैं अभी लोकप्रिय जवाब को थोड़ा और आगे ले जा रहा हूं और इसे और मजबूत बना रहा हूं। यह आपको किसी भी शुरुआत बिंदु को निर्दिष्ट करने देता है, इसलिए उदाहरण के लिए 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 कर सकते हैं या हार्ड कोडिंग कर सकते हैं। एक कदम जोड़ने के लिए एक टेम्प्लेट टैग की आवश्यकता होती है, इसे अधिक उपयोग के मामलों को कवर करना चाहिए ताकि यह एक कदम आगे हो।


यह @ guillermo-siliceo-trueba उत्तर का विस्तार है।
पॉल केंजोरा

5

इसके लिए अनिवार्य रूप से एक rangeफ़ंक्शन की आवश्यकता होती है । एक Django फीचर टिकट उठाया गया था ( https://code.djangoproject.com/ticket/13088 ) इसके लिए लेकिन निम्न टिप्पणी के साथ "ठीक नहीं होगा" के रूप में बंद हुआ।

इस विचार की मेरी धारणा यह है कि यह टेम्पलेट में प्रोग्रामिंग का नेतृत्व करने की कोशिश कर रहा है। यदि आपके पास उन विकल्पों की एक सूची है, जिन्हें प्रदान करने की आवश्यकता है, तो उन्हें व्यू में गणना की जानी चाहिए, न कि टेम्पलेट में। यदि यह मूल्यों की श्रेणी के रूप में सरल है, तो ऐसा ही हो।

उनके पास एक अच्छा बिंदु है - टेम्पलेट्स को दृश्य के बहुत सरल प्रतिनिधित्व माना जाता है। आपको दृश्य में सीमित आवश्यक डेटा बनाना चाहिए और संदर्भ में टेम्पलेट को पास करना चाहिए।


6
दृश्य डेटा के लिए होना चाहिए, प्रस्तुति के लिए टेम्पलेट होना चाहिए। दृश्य को खासतौर पर श्रेणियों की सामग्री के ज्ञान की आवश्यकता नहीं होनी चाहिए। इन फीचर रिक्वेस्ट को नजरअंदाज करने का Django का कारण सरासर बकवास है।
rebs

3

आप उपयोग कर सकते हैं: {% with ''|center: i as range %}


1
क्या आप एक उदाहरण / स्पष्टीकरण प्रदान कर सकते हैं कि यह कैसे काम करता है?
rebs

1

उन लोगों के लिए जो सरल उत्तर की तलाश कर रहे हैं, बस उन्हें मानों की मात्रा प्रदर्शित करने की आवश्यकता है, उदाहरण के लिए 100 पदों में से 3 को केवल जोड़ दें {% for post in posts|slice:"3" %}और इसे सामान्य रूप से लूप करें और केवल 3 पद जोड़े जाएंगे।


0

यदि संख्या एक मॉडल से आ रही है, तो मैंने पाया कि यह मॉडल के लिए एक अच्छा पैच है:

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

2
सुनिश्चित नहीं हैं कि आप मतदान क्यों कर रहे हैं, यह एक मान्य उत्तर है। जैसा कि मैंने ऊपर प्रदान किया है, एक उचित फ़िल्टर लागू करने की तुलना में मुझे यह समाधान पसंद नहीं है। डीबी मॉडल को दुबला रखा जाना चाहिए। लेकिन यह अभी भी बहुमत से स्वीकृत उत्तर से बेहतर है।
rebs

मुझे पता भी नहीं है ...
Alper

मुझे 9 साल बहुत देर हो चुकी है, लेकिन मैंने आपको फेमस कर दिया, इसके बारे में भी चिंता न करें।
साहिल

-5
{% for i in range(10) %}
   {{ i }}

{% endfor %}

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस प्रश्न के उत्तर के बारे में अतिरिक्त संदर्भ प्रदान करता है, इसके दीर्घकालिक मूल्य में सुधार करता है।
xiawi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.