2012-02-28 33 views
44

मैं चर एक पाश के भीतर पाश बाहर घोषित की मूल्य में परिवर्तन करना चाहते अंदर एक चर का मान बदलें। लेकिन हमेशा बदलते हुए, यह लूप के बाहर प्रारंभिक मान रखता है।Jinja2: एक पाश

{% set foo = False %} 

{% for item in items %} 
    {% set foo = True %} 
    {% if foo %} Ok(1)! {% endif %} 
{% endfor %} 

{% if foo %} Ok(2)! {% endif %} 

यह renders:

Ok(1)! 

तो केवल (बुरा) समाधान पाया है अब तक यह था:

{% set foo = [] %} 

{% for item in items %} 
    {% if foo.append(True) %} {% endif %} 
    {% if foo %} Ok(1)! {% endif %} 
{% endfor %} 

{% if foo %} Ok(2)! {% endif %} 

यह renders:

Ok(1)! 
Ok(2)! 

लेकिन, यह बहुत बदसूरत है! क्या एक और अधिक सुरुचिपूर्ण समाधान है?

+3

मुझे नहीं लगता कि किसी अन्य तरीके से है। शायद आप कोड को पुन: व्यवस्थित कर सकते हैं ताकि आपको चर सेट करने की आवश्यकता न हो। प्रश्न के लिए –

+0

+1, क्योंकि यह मेरे लिए उत्तर बन गया :) –

+0

@ शंकर कैबस: महान सवाल। यह शायद 'जिंजा Annoyances' – dreftymac

उत्तर

47

कोशिश भी शब्दकोश आधारित दृष्टिकोण। ऐसा लगता है कि कम बदसूरत है।

{% set vars = {'foo': False} %} 

{% for item in items %} 
    {% if vars.update({'foo': True}) %} {% endif %} 
    {% if vars.foo %} Ok(1)! {% endif %} 
{% endfor %} 

{% if vars.foo %} Ok(2)! {% endif %} 

यह भी प्रस्तुत करता है:

Ok(1)! 
Ok(2)! 
+2

में शामिल हों अभी भी बदसूरत है, लेकिन यह काम करता है। मुझे आश्चर्य है कि जिन्जा 2 के साथ ऐसा करने का कोई पाथोनिक तरीका नहीं है। – kramer65

+0

निश्चित रूप से थोड़ा क्लीनर विशेष रूप से यदि आपको एक से अधिक चर –

+1

TLDR की आवश्यकता है, तो 'सेट सेट' केवल लूप के लिए काम नहीं करता है? – ThorSummoner

1

आप ऐसा कर सकता है टेम्पलेट कोड

{% for item in items %} 
    {{ set_foo_is_true(local_vars) }} 
    {% if local_vars.foo %} Ok(1)! {% endif %} 
{% endfor %} 
{% if local_vars.foo %} Ok(2)! {% endif %} 

और सर्वर कोड प्रयोग में

items = ['item1', 'item2', 'item3'] 
#--------------------------------------------- 
local_vars = { 'foo': False } 
def set_foo_is_true(local_vars): 
    local_vars['foo'] = True 
    return '' 
env.globals['set_foo_is_true'] = set_foo_is_true  
#--------------------------------------------- 
return env.get_template('template.html').render(items=items, local_vars=local_vars) 

यह निम्न

{{ set_local_var(local_vars, "foo", False) }} 
{% for item in items %} 
    {{ set_local_var(local_vars, "foo", True) }} 
    {% if local_vars.foo %} Ok(1)! {% endif %} 
{% endfor %} 
{% if local_vars.foo %} Ok(2)! {% endif %} 

करने और में सामान्यीकृत किया जा सकता है साफ करने के लिए सर्वर कोड

का उपयोग करें
items = ['item1', 'item2', 'item3'] 
#--------------------------------------------- 
local_vars = { 'foo': False } 
def set_local_var(local_vars, name, value): 
    local_vars[name] = value 
    return '' 
env.globals['set_local_var'] = set_local_var 
#--------------------------------------------- 
return env.get_template('template.html').render(items=items, local_vars=local_vars) 
4

दस्तावेज में उल्लेख किया:

कृपया ध्यान दें कि छोरों में कार्य यात्रा के अंत में साफ हो जाएगा और अधिक जीवित नहीं कर सकते पाश गुंजाइश

लेकिन संस्करण 2.10 के रूप में आप का उपयोग कर सकते नामस्थान:

{% set ns = namespace(foo=false) %}  
    {% for item in items %} 
     {% set ns.foo = True %} 
     {% if ns.foo %} Ok(1)! {% endif %} 
    {% endfor %} 

    {% if ns.foo %} Ok(2)! {% endif %}