जीजा टेम्प्लेट में लूप के लिए वैरिएबल कैसे बढ़ाएं?


83

मैं कुछ ऐसा करना चाहूंगा:

वेरिएबल पी टेस्टोस्टेरोन से है जो एक सूची ['ए', 'बी', 'सी', 'डी'] है

{% for i in p %}
{{variable++}}
{{variable}}

परिणाम आउटपुट है:
1 2 3 4

जवाबों:


157

आप उपयोग कर सकते हैं loop.index:

{% for i in p %}
  {{ loop.index }}
{% endfor %}

टेम्प्लेट डिज़ाइनर प्रलेखन की जाँच करें ।

हाल ही के संस्करणों में, नियमों के कारण, निम्नलिखित काम नहीं करेंगे :

{% set count = 1 %}
{% for i in p %}
  {{ count }}
  {% set count = count + 1 %}
{% endfor %}

इस उत्तर का उपयोग
स्कूपिंग

68

2.10 के बाद, गुंजाइश समस्या को हल करने के लिए, आप कुछ इस तरह से कर सकते हैं:

{% set count = namespace(value=0) %}
{% for i in p %}
  {{ count.value }}
  {% set count.value = count.value + 1 %}
{% endfor %}

1
मुझे त्रुटि मिलती है: TemplateSyntaxError at / लिस्टिंग / अमान्य ब्लॉक टैग 145 लाइन पर: 'सेट', अपेक्षित 'एंडब्लॉक'। क्या आप इस टैग को पंजीकृत या लोड करना भूल गए? ऑन: {% सेट काउंट = नेमस्पेस (मान = 0)%} इसका कारण क्या है?
एंड्रयू

56

जैसा कि जेरोइन कहते हैं कि डगमगाते मुद्दे हैं: यदि आप लूप के बाहर 'गिनती' सेट करते हैं, तो आप इसे लूप के अंदर संशोधित नहीं कर सकते।

आप 'काउंट' के लिए स्केलर के बजाय किसी ऑब्जेक्ट का उपयोग करके इस व्यवहार को हरा सकते हैं:

{% set count = [1] %}

अब आप फ़ॉरलूप के अंदर गिनती में हेरफेर कर सकते हैं या एक% में% भी शामिल कर सकते हैं। यहां बताया गया है कि मैं किस तरह से गिनती बढ़ाता हूं (हां, यह हास्यास्पद है लेकिन ओह अच्छी तरह से):

{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}

पीटर हॉलिंग्सवर्थ। उस जानकारी के लिए बहुत बहुत धन्यवाद, मेरी बहुत मदद की।
mthecreator

6
एक और समाधान जो एक बिट क्लीनर इमो है एक खाली सूची को इनिशियलाइज़ {% set count = [] %}करने के लिए, प्रत्येक लूप में सूची में एक आइटम जोड़ें {% set __ = index.append(1) %}और इंडेक्स प्रदर्शित करने के लिए लंबाई का उपयोग करें index|length
आंखों की रोशनी

1
इसके अलावा, आप उपयोग कर सकते हैं करते हैं इस तरह बयान {% do index.append(1) %} लेकिन आप जोड़ने के लिए विस्तार वर्णित यहाँ
AstraSerg

2
@Eyettea के स्वच्छ समाधान को ठीक करना: एक अन्य समाधान जो कि एक बिट क्लीनर imo है {% set count = [ ] %}, एक खाली सूची को इनिशियलाइज़ करने के लिए, प्रत्येक लूप में सूची में एक आइटम जोड़ें {% set __ = count.append(1) %}और गिनती प्रदर्शित करने के लिए लंबाई का उपयोग करेंcount|length
PYB

14

यहाँ मेरा समाधान है:

सभी काउंटरों को एक शब्दकोष में रखें:

{% set counter = {
    'counter1': 0,
    'counter2': 0,
    'etc': 0,
    } %}

उन्हें आसानी से बढ़ाने के लिए एक मैक्रो को परिभाषित करें:

{% macro increment(dct, key, inc=1)%}
    {% if dct.update({key: dct[key] + inc}) %} {% endif %}
{% endmacro %}

अब, जब भी आप 'काउंटर 1' काउंटर को बढ़ाना चाहते हैं, बस करें:

{{ increment(counter, 'counter1') }}

एक गड़बड़ समस्या का सुरुचिपूर्ण समाधान। धन्यवाद!
सेवकप्रेम

बहुत अच्छा! मुझे छोरों के लिए दो नेस्टेड भर में एक संचयी गिनती सूचकांक रोलिंग की आवश्यकता थी। यह उस उपयोग के मामले के लिए बहुत अच्छा काम करता है।
jxramos

2

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

{% if sloupec3: %}
    {% set counter = 1 %}
    {% for row in sloupec3: %}
        {% if counter == 3 %}
            {% set counter = 1 %}        
        {% endif %} 

        {% if  counter == 1: %}
           <div class="red"> some red div </div>
        {% endif %} 

        {% if counter == 2: %}
           <div class="gray"> some gray div </div>
        {% endif %} 

        {% set counter = counter + 1 %} 

    {% endfor %}

{% endif %}

मैंने इस तरह लूप का इस्तेमाल किया। यह काम करता है:

{% if sloupec3: %}

    {% for row in sloupec3: %} 

        {% if  loop.index % 2 == 1: %}
           <div class="red"> some red div </div>
        {% endif %} 

        {% if loop.index % 2 == 0: %}
           <div class="gray"> some gray div </div>
        {% endif %}  

    {% endfor %}

{% endif %}

1

अगर किसी को लूप के अंदर एक मूल्य जोड़ना है तो आप इसके 100% काम कर सकते हैं

{% set ftotal= {'total': 0} %} 
{%- for pe in payment_entry -%}
    {% if ftotal.update({'total': ftotal.total + 5}) %}{% endif %} 
{%- endfor -%}

{{ftotal.total}}

आउटपुट = 5


0

Django के ऐसा करने के तरीके की खोज में आया और इस पोस्ट को पाया। हो सकता है कि किसी और को यहां आने वाले django समाधान की आवश्यकता हो।

{% for item in item_list %}
    {{ forloop.counter }} {# starting index 1 #}
    {{ forloop.counter0 }} {# starting index 0 #}

    {# do your stuff #}
{% endfor %}

यहां पढ़ें: https://docs.djangoproject.com/en/1.11/ref/templates/builtins/


2
यह Django टेम्प्लेट इंजन है, ओपी ने jinja2 के लिए कहा
जाहिद

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