2010-08-03 9 views
21

अगर मैं वापसी तो की तरह एक Jinja2 टेम्पलेट: return render_response('home.htm', **context)Jinja 2 टेम्पलेट से वर्तमान चर की सूची कैसे प्राप्त करें?

कैसे तो टेम्पलेट के भीतर से संदर्भ में चरों की सूची मिलता है?

+0

रीडिन के बारे में कैसे जी टेम्पलेट स्रोत? इसमें गलत क्या है? –

उत्तर

34

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

  1. एक Jinja context function परिभाषित jinja2.Context वस्तु है, जो अनिवार्य रूप से वैश्विक चर का एक शब्दकोश है/कार्य

  2. कि समारोह ग्लोबल नेम स्पेस में उपलब्ध कराएं वापस जाने के लिए; यानी एक jinja2. पर्यावरण या jinja2। टेम्पलेट ग्लोबल्स शब्दकोश

  3. वैकल्पिक रूप से, संदर्भ से वस्तुओं को फ़िल्टर करें; उदाहरण के लिए, जिन्जा के डिफ़ॉल्ट वैश्विक सहायक कार्यों (रेंज, योजक इत्यादि) को छोड़ने के लिए callable() का उपयोग करें। यह संदर्भ समारोह या टेम्पलेट में किया जा सकता है; जहां भी यह सबसे ज्यादा समझ में आता है।

उदाहरण:

>>> import jinja2 
>>> 
>>> @jinja2.contextfunction 
... def get_context(c): 
...   return c 
... 
>>> tmpl = """ 
... {% for key, value in context().items() %} 
...  {% if not callable(value) %} 
...   {{ key }}:{{ value }} 
...  {% endif %} 
... {% endfor %} 
... """ 
>>> 
>>> template = jinja2.Template(tmpl) 
>>> template.globals['context'] = get_context 
>>> template.globals['callable'] = callable 
>>> 
>>> context = {'a': 1, 'b': 2, 'c': 3} 
>>> 
>>> print(template.render(**context)) 
     a:1 
     c:3 
     b:2 

[वैकल्पिक रूप से, ('home.htm', context=context) साथ render_response फोन अन्य समाधान काम करने के लिए।]

+4

बहुत धन्यवाद। मैं आपके बेहतर Jinja2 ज्ञान के लिए धनुष। – Christian

+0

ध्यान दें कि 'कॉल करने योग्य' चेक के कारण, आपका समाधान उन कार्यों को अवहेलना करेगा जो संदर्भ के हिस्से के रूप में स्पष्ट रूप से पारित किए गए हैं। शायद अक्सर नहीं होता है, लेकिन एक फर्क पड़ सकता है। –

+1

सच है। यह सरल समाधान निश्चित रूप से सुधार किया जा सकता है। उदाहरण के लिए, यदि '' टेम्पलेट'' वैश्विक है, तो '' get_context() '' '' 'संदर्भ 'के आधार पर एक नया शब्दकोश वापस कर सकता है लेकिन बिना किसी कुंजी के जो' template.globals'' में मौजूद है। – Garrett

1

यहाँ है कि कैसे एक बोतल app से काम कर @crewbum's answer पाने के लिए:

import jinja2 

@jinja2.contextfunction 
def get_context(c): 
    return c 

app.jinja_env.globals['context'] = get_context 
app.jinja_env.globals['callable'] = callable 
+0

आप इसे कहां रखते हैं? – johnny

+0

ऐप प्रारंभिक (या ऐप फैक्ट्री) में। यदि आप फ्लास्क-स्क्लक्लेमी, फ्लास्क-लॉगिन इत्यादि जैसे किसी भी फ्लास्क एक्सटेंशन का उपयोग करते हैं, तो यह उसी स्थान पर हो सकता है जहां वे बनाए गए हैं। –

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

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