2009-12-12 18 views
20

को तर्क पासिंग मैंDjango: माता-पिता टेम्पलेट

project 
- main_templates (including nav bar) 
-- app1 
--- app1_base_template 
--- app1_templates 
-- app2 
--- app2_base_template 
--- app2_templates 

तो जब प्रतिपादन, app2_templates app2_base_template जो main_template फैली फैली इस शैली की खाका नहीं है।

मुझे क्या करने की ज़रूरत है, क्या संबंधित एनवी आइटम बोल्ड हो सकता है जब ऐप 2 का टेम्पलेट प्रस्तुत किया जा रहा हो (उपयोगकर्ता को वह कहां दिखाएं)।

सबसे आसान होगा अगर मैं {% ब्लॉक xxx%} भाग में एक चर पारित कर सकता हूं। क्या यह संभव है?

अन्य सामान्य तरीके क्या हैं?

+0

क्या आपने इसे चेक आउट किया है? http://stackoverflow.com/questions/1024168/django-is-there-a-better-way-to-bold-the-current-page-link – rinti

+2

वह सीएसएस समाधान बनाए रखने के लिए बहुत कठिन लग रहा है और उसे जोड़ने की आवश्यकता है 3 अलग-अलग स्थानों में। हाई-टेक दृष्टिकोण के लिए – Boris

उत्तर

41

क्या आपने {% with%} टेम्पलेट टैग की कोशिश की है?

{% block content %} 
    {% with 'myvar' as expectedVarName %} 
    {{block.super}} 
    {% endwith %} 
{% endblock content %} 
+0

क्षमा करें, यह grokking नहीं है। यह base.html में है, और navbar को संदर्भित करने के लिए 'block.super' है ...? मेरे पास मेरे आधार पर मेरा navbar शामिल है, * फिर * मेरी 'ब्लॉक सामग्री' ... यह काम करने के लिए इसे कैसे स्थापित किया जाना चाहिए? – Pureferret

+3

दिलचस्प हैक लेकिन पूर्ण समाधान नहीं। इस काम के लिए मूल टेम्पलेट को '{% ब्लॉक सामग्री%}' से घिरा होना चाहिए और इससे मुझे 'सामग्री' के अंदर किसी अन्य ब्लॉक को ओवरराइट करने से रोकता है। – Kos

+0

Django 1.11+ में सिंटैक्स बदल गया, भले ही पुराना अभी भी समर्थित है: https: //docs.djangoproject.com/en/1.11/ref/templates/builtins/#with। {% 'Myvar' के साथ अपेक्षित के रूप में VarName% } => अपेक्षित VarName = 'myvar'%} के साथ {% – ThePhi

2

मूल टेम्पलेट से वेरिएबल स्वचालित रूप से बच्चे के दायरे में शामिल होते हैं। आपका शीर्षक कहता है कि आप पैरेंट को एक वैरिएबल पास करना चाहते हैं, जो समझ में नहीं आता है, क्योंकि आप टेम्पलेट्स में चर परिभाषित नहीं कर सकते हैं। यदि आपको माता-पिता और बच्चे दोनों में एक चर की आवश्यकता है, तो इसे केवल दृश्य में घोषित करें।

8

टेम्पलेट विरासत पेड़ को आपके द्वारा वर्णित तरीके से एक चर को पारित करने का कोई सीधा तरीका नहीं है। जिस तरह से लोग नेविगेशन बार लागू करते हैं जो वर्तमान पृष्ठ को हाइलाइट करते हैं, अक्सर साइट की प्रकृति के लिए tweaked है। यही कारण है कि कहा, मैं दो आम तरीके देखा है:

कम तकनीकी दृष्टिकोण

टेम्पलेट संदर्भ जो इंगित करता है जो टैब सक्रिय है में एक चर दर्रा:

# in views.py 
def my_view(request): 
    return render_to_response('app2_template.html', {"active_tab": "bar"}, 

<!-- Parent template --> 
<div id="navigation"> 
    <a href="/foo" {% ifequal active_tab "foo" %}class="active"{% endifequal %}>Foo</a> 
    <a href="/bar" {% ifequal active_tab "bar" %}class="active"{% endifequal %}>Bar</a> 
</div> 

उच्च -टेक दृष्टिकोण

अपने नेविगेशन बार को प्रस्तुत करने के लिए custom template tag लागू करें। टैग एक चर कि इंगित करता है जो अनुभाग सक्रिय है ले लो:

<!-- Parent template --> 

<div id="navigation">{% block mainnav %}{% endblock %}</div> 

<!-- any child template --> 
{% load my_custom_nav_tag %} 
{% block mainnav %}{% my_custom_nav_tag "tab_that_is_active" %}{% endblock %} 

आप काफी वहाँ से पागल जा सकते हैं। आप पाते हैं कि किसी ने पहले ही कुछ ऐसा लागू किया है जो आपके लिए djangosnippets.org पर काम करेगा।

+0

+1। मुझे यह काम करने के लिए कुछ शोध लिया, कुछ विस्तार और संदर्भ जो फाइलें रखे जाएंगे, जहां भविष्य में कुछ लोगों की मदद मिलेगी। – SpiRail

1

दुख की बात है कि मुझे एक साफ रास्ता नहीं मिल रहा है।

प्रत्येक एप्लिकेशन की base.html में एक टैग डाल समाप्त हुई: (।। मुख्य एनएवी के लिए एप्लिकेशन की आधार द्वारा वास्तव में मैं उपयोग दो एक सेट एक एप्लिकेशन के नेविगेशन बार के लिए ऐप्लिकेशन के पृष्ठों द्वारा निर्धारित)

<span class="main_nav_bar_hint" id="2"></span> 

और परियोजना में JQuery जादू का एक सा base.html

$(document).ready(function() { $("#nav_menu_" + $(".main_nav_bar_hint").attr("id")).removeClass("normal").addClass("selected"); }) 

यह एक हैक का एक सा है, लेकिन इस तरह से अपनी आसान समझने के लिए और मैं केवल एक बार और अधिक क्षुधा जोड़ रहे हैं तार्किक बदलाव करने की जरूरत।

2

टेम्पलेट समावेशन पर तर्क पारित करने में असमर्थता Django टेम्पलेट सिस्टम की कई विफलताओं में से एक है।

मुझे लगभग समान समस्या से निपटना पड़ा: अभिभावक टेम्पलेट्स को अलग-अलग प्रारूप/हाइलाइट करने के लिए गहरा घोंसला वाले टेम्पलेट्स की आवश्यकता होती है।

संभावित समाधान:

  1. एक "सुपर संदर्भ" नियमित है कि मूल्यों की एक संख्या जहां पदानुक्रम में आप कर रहे हैं के आधार पर सेट का उपयोग करें। अर्थात। super_context = MySuperContext (अनुरोध, अन्य, मान, इत्यादि), जहां super_context एक ऐसा नियम है जिसे आप दृश्य में पास करते हैं (या RequestContext)। यह सबसे Django-thnonic (?) दृष्टिकोण है, लेकिन इसका मतलब है कि प्रस्तुति तर्क को विचारों में वापस धकेल दिया गया है, जो मुझे गलत लगता है।

  2. निचले स्तर के टेम्पलेट्स में मान सेट करने के लिए expr टेम्पलेट टैग का उपयोग करें। नोट: यह केवल तभी काम करता है जब आप {%%% को टेम्पलेट शामिल करते हैं] क्योंकि समावेशन होने से पहले इसका मूल्यांकन किया जाना चाहिए। आप इसे {% विस्तारित%} के साथ नहीं कर सकते क्योंकि यह बच्चे के टेम्पलेट में पहली बात होनी चाहिए।

  3. Jinja2 पर स्विच करें, कम से कम उन विचारों के लिए जहां आपको यह करने की आवश्यकता है।

एक बार जब आप इन मूल्यों है सेट आप इस तरह कर सकते हैं:

<div class="foo{% if foo_active%}_active{%endif%}"> stuff </div> 

इस div class "foo" जब यह सक्रिय नहीं है और "foo_active" है जब यह है बनाता है। स्वाद के लिए शैली, लेकिन बहुत ज्यादा दालचीनी नहीं जोड़ें। :-)

2

मैं में एक समान, अरे ... संदर्भ Jarret हार्डी के "कम तकनीक" दृष्टिकोण अपनाया है (हाँ, यह एक यमक ... जो आप के लिए एकदम सही मतलब नहीं होगा जब तक कि मैं आपको बता दूँ कि मैं नौसेना नहीं कर रहा था, लेकिन यह दिखाने के लिए बटनों के सीमा रंग को सेट किया गया था कि कौन सा दबाया गया था)।

लेकिन मेरा संस्करण थोड़ा और कॉम्पैक्ट है जो मुझे लगता है। दृश्य में केवल एक साधारण संदर्भ परिवर्तनीय सक्रियबार को परिभाषित करने के बजाय, मैं एक शब्दकोश देता हूं, लेकिन हमेशा केवल एक कुंजी-मूल्य जोड़ी के साथ: उदा। activebar = {'foo': 'active'}।

फिर टेम्पलेट में मैं बस foo एंकर में वर्ग = "{{activebar.foo}}" लिखता हूं, और अन्य एंकरों में संगत रूप से लिखता हूं। अगर केवल activbar.foo को "सक्रिय" मान के लिए परिभाषित किया गया है तो बार एंकर में activebar.bar कुछ भी नहीं करेगा। शायद "चुपचाप विफल" उचित Django बात है। और बॉब का चाचा।

संपादित करें: ओह ... कुछ दिन बीत चुके हैं, और जब मैंने ऊपर लिखा था, तो मेरे लिए काम किया गया था जब मैं नेविबार में लक्ष्य के रूप में एक नई खिड़की के साथ एक एंकर लगाया। यह एक अजीब गड़बड़ी का कारण प्रतीत होता था: नई विंडो (फ़ायरफ़ॉक्स में टैब) पर क्लिक करने के बाद और फिर उस पर लौटने के बाद जिस पर नई विंडो लॉन्च की गई थी, जब भी मैं जल्दी से स्थानांतरित हो गया तब नेवबार के नीचे प्रदर्शन का भाग रिक्त हो गया नेबर पर वस्तुओं पर कर्सर --- कुछ भी क्लिक किए बिना। मुझे स्क्रॉल बार को स्थानांतरित करके एक स्क्रीन रेड्रो को मजबूर करना पड़ा (पृष्ठ रीलोड नहीं, हालांकि यह भी काम करता था क्योंकि इसमें स्क्रीन रीड्रा शामिल है)।

मुझे यह पता लगाने के लिए बहुत कुछ नहीं है कि ऐसा क्यों हो सकता है। और यह संभव है कि मैंने कुछ और किया जिससे किसी समस्या का कारण बन गया। लेकिन ... मुझे एक आसान दृष्टिकोण मिला जो मेरे लिए पूरी तरह से काम कर रहा है। मेरी परिस्थितियां ये हैं कि एक दृश्य से लॉन्च किए गए प्रत्येक बच्चे टेम्पलेट को एक सक्रिय नेविबार आइटम को "सक्रिय" के रूप में दिखाया जाना चाहिए। दरअसल, वह navbar आइटम वह है जिसने उस दृश्य को लॉन्च किया जिसने बाल टेम्पलेट लॉन्च किया - सामान्य सौदा।

मेरा समाधान --- चलिए एक उदाहरण के रूप में "लॉगिन" नेविबार आइटम लेते हैं --- इसे उस बच्चे टेम्पलेट में रखना है जिसमें लॉगिन फ़ॉर्म है।

{% block login %}active{% endblock %} 

मैं इसे शीर्षक ब्लॉक नीचे में डाल, लेकिन मैं प्लेसमेंट कोई फर्क लगता नहीं है। फिर उस नेवबार परिभाषा ली टैग कि लॉगिन नेवबार आइटम मैं डाल के लिए लंगर चारों ओर से घेरे ... अच्छी तरह से करने के लिए, यहाँ शामिल माता पिता टेम्पलेट में कोड है:

<li class="{% block login %}{% endblock %}"><a href="/mysite/login">Login</a></li> 

इस प्रकार जब बच्चे टेम्पलेट प्रदान की गई है अभिभावक लॉगिन के रूप में लॉगिन navbar आइटम दिखाएगा, और बॉब अभी भी आपके चाचा।

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

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