/ / चर की आवश्यकता के लिए एक टेम्पलेट पूछें? - django, चर, django-टेम्पलेट्स

चर की आवश्यकता के लिए एक टेम्पलेट पूछें? - django, चर, django-टेम्पलेट्स

मैं एक टेम्पलेट को तुरंत चालू करने में सक्षम होना चाहता हूंएक फ़ाइल से (संभवतः django.template.loader.get_template (फ़ाइल नाम) का उपयोग करके), और उसके बाद वैरिएबल का सेट निर्धारित करें जिसे परिभाषित किया जाना चाहिए कि जो भी संदर्भ पारित किया गया है।

मैंने सोचा कि टेम्पलेट ऑब्जेक्ट पर एक विधि होगी, लेकिन ऐसा प्रतीत नहीं होता है।

मैंने दस्तावेज़ पढ़े, और मुझे सबसे नज़दीकी मिला यह था:

http://docs.djangoproject.com/en/1.0/topics/templates/#using-the-built-in-reference

जो किसी दिए गए दृश्य से जुड़े सभी चर देखने के लिए व्यवस्थापक इंटरफ़ेस पर जाने का सुझाव देता है।

मैं व्यवस्थापक इंटरफ़ेस से गुजरना नहीं चाहता क्योंकि मैं इसे प्रोग्रामेटिक रूप से करना चाहता हूं - मैं परीक्षण लिखने की कोशिश कर रहा हूं।

मैं Django संस्करण (1, 0, 2, "अंतिम", 0) का उपयोग कर रहा हूँ

अपडेट किया गया:

मैंने synack के जवाब की कोशिश की और पाया कि (के साथfilter_expression.var द्वारा filter_expression.token द्वारा फ़िल्टर_expression.token के प्रतिस्थापन, टैग के बिना वैरिएबल का वास्तविक नाम प्राप्त करने के लिए) और यह उन चरों को वापस कर देता है जिन्हें टेम्पलेट में स्थानीय रूप से परिभाषित किया गया है, लेकिन माता-पिता में परिभाषित चर के लिए काम नहीं किया है फैली हुई है।

तो उदाहरण के लिए, मान लें कि मेरे पास दो फाइलों में टेम्पलेट्स हैं:

toyparent.html:

{%block base_results%}
Django is {{adjective}}
{%endblock base_results%}

toychild.html:

{% extends "toyparent.html" %}

{%block base_results%}
{{block.super}}
I {{verb}} it.
{%endblock base_results %}

और मैं बाल टेम्पलेट लोड करता हूं:

>>> toy=django.template.loader.get_template("toychild.html")

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

>>> toy.render(django.template.Context(dict(adjective="cool",verb="heart")))
u"n    nDjango is coolnn    I heart it.nn"

लेकिन मैं इससे दो चर नहीं प्राप्त कर सकता:

>>> v=toy.nodelist.get_nodes_by_type(VariableNode)
>>> for k in v: print k.filter_expression.var
...
block.super
verb

उत्तर:

उत्तर № 1 के लिए 20

आप टेम्पलेट की दृष्टि से निरीक्षण कर सकते हैं और उस टेम्पलेट के नोडलिस्ट में किसी भी "वेरिएबल नोड" ऑब्जेक्ट्स की उपस्थिति का निरीक्षण कर सकते हैं:

>>> from django.template import Template, Context
>>> t = Template("Django is {{ adjective }} and I {{ verb }} it.")
>>> t.nodelist
[<Text Node: "Django is ">, <Variable Node: adjective>, <Text Node: " and I ">, <Variable Node: verb>, <Text Node: " it.">]

ये प्रकार के हैं VariableNode, जो एक वर्ग है जिसे सीधे तुलना में उपयोग के लिए आयात किया जा सकता है। कोई भी Node उदाहरण में एक है get_nodes_by_type() विधि जिसे नोडलिस्ट के खिलाफ बुलाया जा सकता है, जो टेम्पलेट के लिए उस प्रकार के सभी नोड्स को वापस कर देता है। उदाहरण:

>>> from django.template import VariableNode
>>> varnodes = t.nodelist.get_nodes_by_type(VariableNode)
>>> varnodes
[<Variable Node: adjective>, <Variable Node: verb>]

तो अब आपके पास टेम्पलेट के लिए चर की एक सूची है। प्रत्येक चर के वास्तविक नाम को निकालने के लिए इसे एक कदम आगे ले जाने की आवश्यकता होगी, बिना बेवकूफ स्ट्रिंग-स्लाइसिंग चाल repr नाम।

परिवर्तनीय नाम स्वयं ही संग्रहीत है filter_expression.token प्रत्येक के लिए VariableNode:

>>> varnodes[0].filter_expression.token
u"adjective"

और इसलिए एक साधारण सूची समझ हमें टेम्पलेट के लिए सभी परिवर्तनीय नाम प्राप्त करती है:

>>> template_vars = [x.filter_expression.token for x in varnodes]
>>> template_vars
[u"adjective", u"verb"]

तो, सबसे आसान समाधान नहीं है, लेकिन अगर कोई बेहतर तरीका है तो मुझे इसके बारे में पता नहीं है।

बोनस: एक समारोह!!

from django.template import VariableNode
def get_template_vars(t):
varnodes = t.nodelist.get_nodes_by_type(VariableNode)
return [x.filter_expression.token for x in varnodes]

ठीक है, यह सब के बाद इतना जटिल नहीं है!

अनुवर्ती संपादन: मूल टेम्पलेट्स से चर प्राप्त करना

(यह अनुवर्ती अद्यतन प्रश्न से जानकारी का उपयोग कर रहा है)।

यह वह जगह है जहां यह वास्तव में जटिल हो जाता है क्योंकि खिलौना टेम्पलेट का नोडलिस्ट एक एकल है ExtendsNode (इस मामले में)।

>>> toy.nodelist
[<ExtendsNode: extends "mysite/toyparent.html">]

मैं कल्पना करता हूं कि बड़े टेम्पलेट्स में कई हो सकते हैं ExtendsNode वस्तुओं। किसी भी तरह, यदि आप का निरीक्षण करते हैं ExtendsNode, और इसके द्वारा मूल टेम्पलेट निकालें, आप माता-पिता को मेरे मूल उदाहरण के समान व्यवहार करने में सक्षम हैं:

>>> enode = toy.nodelist[0]
>>> enode.parent_name
u"mysite/toyparent.html"
>>> parent = enode.get_parent(enode.parent_name)
>>> parent
<django.template.Template object at 0x101c43790>
>>> parent.nodelist.get_nodes_by_type(VariableNode)
[<Variable Node: adjective>]

और तुम्हारा है adjective अभिभावक टेम्पलेट से निकाला गया चर। एक के खिलाफ एक परीक्षण करने के लिए ExtendsNode आप से कक्षा आयात कर सकते हैं django.template.loader_tags:

>>> from django.template.loader_tags import ExtendsNode
>>> ext = toy.nodelist.get_nodes_by_type(ExtendsNode)
>>> ext
[<ExtendsNode: extends "mysite/toyparent.html">]

तो, आप एक की उपस्थिति के लिए टेम्पलेट्स के खिलाफ कुछ परीक्षण कर सकते हैं ExtendsNode और पैरेंट टेम्पलेट पर पीछे की ओर चलें और व्यक्तिगत रूप से उन चर नामों को प्राप्त करें। हालांकि, यह कीड़े के रूप में प्रतीत होता है।

उदाहरण के लिए, यदि आप ऐसा करना चाहते थे:

>>> toy.nodelist.get_nodes_by_type((ExtendsNode, VariableNode))
[<ExtendsNode: extends "mysite/toyparent.html">, <Variable Node: block.super>, <Variable Node: verb>]

अब आपको मिल गया है ExtendsNode तथा VariableNode वस्तुओं और यह सिर्फ भ्रमित हो जाना शुरू होता है। तो फिर हम क्या करें? क्या हम किसी को अनदेखा करने का प्रयास करते हैं block इस तरह के परीक्षण से चर आया? मुझे नहीं पता!!

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