2012-12-19 11 views
11

मान लें, मैंने एक टेम्पलेट ऑब्जेक्ट बनाया है (उदाहरण के लिए environment.from_string(template_path) का उपयोग कर)। क्या यह जांचना संभव है कि दिए गए टेम्पलेट में दिया गया चर नाम मौजूद है या नहीं?यह जांचने के लिए कि क्या दिया गया चर jinja2 टेम्पलेट में मौजूद है?

मैं जानना चाहता हूँ, अगर

template.render(x="text for x") 

कोई असर होगा (अगर कुछ वास्तव में "एक्स के लिए पाठ" या नहीं द्वारा प्रतिस्थापित किया जाएगा) चाहते हैं। यह जांचने के लिए कि क्या चर एक्स मौजूद है?

+1

क्या करें टेम्पलेट या टेम्पलेट में प्रस्तुत करने से पहले आप चर के लिए जांचना चाहते हैं? प्रतिपादन से पहले – munk

+1

! मुझे यह जांचने की ज़रूरत है कि प्रतिपादन प्रभाव कोई समझ में आएगा ... –

+1

तो आप यह जांचना चाहते हैं कि परिवर्तनीय एक्स वास्तव में टेम्पलेट में संदर्भित है? – munk

उत्तर

25
प्रलेखन से

:

परिभाषित (मान)

वापसी अगर सही है चर परिभाषित किया गया है:

{% if variable is defined %} 
    value of variable: {{ variable }} 
{% else %} 
    variable is not defined 
{% endif %} 
See the default() filter for a simple way to set undefined variables. 

संपादित करें: ऐसा लगता है आप जानना चाहते हैं, तो एक मूल्य के पारित कर दिया प्रतिपादन संदर्भ में। उस स्थिति में आप jinja2.meta.find_undeclared_variables का उपयोग कर सकते हैं, जो आपको मूल्यांकन के लिए टेम्पलेट्स में उपयोग किए जाने वाले सभी चरों की एक सूची लौटाएगा।

+1

बिल्कुल मेरा मतलब नहीं था - मुझे यह जांचना होगा कि '{{variable}}' खंड टेम्पलेट टेक्स्ट में मौजूद है या नहीं। –

-2

आप ऐसा नहीं कर सकते हैं।

मुझे लगता है कि आप टेम्पलेट को पार्स कर सकते हैं और फिर एएसटी चल सकते हैं यह देखने के लिए कि संदर्भ हैं या नहीं, लेकिन यह कुछ जटिल कोड होगा।

+1

आपने मेरे लिए बुरी खबर लाई। क्या आप इस तरह के पार्सिंग के लिए कोई सुझाव दे सकते हैं? Jinja2 शायद वैसे भी इसे पार्स, मुझे आश्चर्य है कि इस प्रक्रिया के प्रभावों तक पहुंच हासिल करना संभव है। –

1

मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है, या यदि यह सभी मामलों में काम करेगा, लेकिन मुझे लगता है कि आपके पास स्ट्रिंग में टेम्पलेट टेक्स्ट है, या तो क्योंकि आपने इसे स्ट्रिंग या आपके प्रोग्राम ने स्ट्रिंग में स्रोत टेम्पलेट पढ़ा है।

मैं नियमित अभिव्यक्ति पुस्तकालय का प्रयोग करेंगे, फिर

>>> import re 
>>> template = "{% block body %} This is x.foo: {{ x.foo }} {% endblock %}" 
>>> expr = "\{\{.*x.*\}\}" 
>>> result = re.search(expr, template) 
>>> try: 
>>>  print result.group(0) 
>>> except IndexError: 
>>>  print "Variable not used" 

परिणाम होगा:

'{{ x.foo }}' 

या अपवाद मैं पकड़ा फेंक:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: no such group 

जो प्रिंट होगा " परिवर्तनीय उपयोग नहीं किया गया "

संबंधित मुद्दे