2010-02-09 14 views
14

मेरे पास एक मूल टेम्पलेट है जिसमें एक सामान्य नेविगेशन मेनू होता है। मैं उचित मेनू विकल्प में class="selected" जोड़ने में सक्षम होना चाहता हूं।Django टेम्पलेट्स - क्या मैं एक चर टेम्पलेट में उपयोग करने के लिए एक चर सेट कर सकते हैं?

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

{% set menu = "products" %} 

और कार्य करें:

{%ifequal menu "products" %}class="selected"{% endifequal %} 

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

क्या मैं इसे "गैर-डैंजो" दिमागी सेट से देख रहा हूं?

किसी भी मदद की वास्तव में सराहना की जाएगी। धन्यवाद।

+0

+1, मैं भी इस वैकल्पिक रूप से सोचा (या,, सोच अगर यह बुरा अभ्यास नहीं)। एक समान प्रभाव यह जान सकता है कि कौन सा टेम्पलेट – Agos

+0

जिन्जा 2 इसका समर्थन करता है लेकिन मैं भी django में ऐसा करने का एक तरीका ढूंढ रहा हूं। – Gattster

उत्तर

1

बेशक यहां एक से अधिक उत्तर हैं!

आप मेनू को आकर्षित करने और उपयुक्त एक का चयन करने के लिए कस्टम टेम्पलेट टैग का उपयोग कर सकते हैं।

तो अपने टेम्पलेट टैग होगा:

{% mymainmenu selecteditem %} 

Django साइट पर कस्टम टेम्पलेट टैग प्रलेखन पर एक नज़र डालें, लेकिन यह की तरह कुछ खत्म हो जाएगा:

@register.simple_tag 
def mymainmenu(selecteditem): 

    html = '' 

    build the html for the menu here and include selected class 

    return html 
+0

वास्तव में एक से अधिक उत्तर हैं, लेकिन यह करने का यह एक स्पष्ट तरीका है। (हालांकि यह पहले स्पष्ट नहीं हो सकता है!) – jcdyer

9

संदर्भ आप आप के भीतर पास करना आपके द्वारा विस्तारित टेम्पलेट्स में भी उपलब्ध है। एक 'menu_class' जोड़ना: संदर्भ में 'चुना', आप आधार टेम्पलेट में

<div id="menu" class="{{ menu_class }}"> 

सेट कर सकते हैं।

एक और तरीका है चारों ओर

<div id="menu" class="mymenu {% block menu_attrib %}{% endblock %}"> 

जो तब तक

{% block menu_attrib %}selected{% endblock %} 
+0

लेकिन आप उस ब्लॉक को मूल टेम्पलेट में दोहराना नहीं कर सकते हैं, है ना? – thomaskonrad

0

सभी को धन्यवाद अपने बच्चे टेम्पलेट में लचीला है हो सकता है - अंत में मैं Speakman के सुझाव का पालन किया और वर्तमान मेनू के नाम कर दिया इन संदर्भ में विकल्प और मेरा उपयोग करें:

{%ifequal menu "products" %} 
    class="selected" 
{% endifequal %} 

प्रत्येक मेनू में खंड opton।

मुझे नहीं लगता कि यह एक महान समाधान है, यह मेरी 'टेम्पलेट्स' से भी अधिक मैं इसे पसंद किया है | ... लेकिन शायद इस रिकॉर्ड के लिए बस रों Django मोड़

+0

फिर स्पीकमैन के उत्तर के बगल में स्थित चेक मार्क पर क्लिक करें। बीटीडब्लू, डीजेंगो लोगों ने जानबूझकर '{%%%} को रोक दिया है, जो फ़ंक्शन जैसे मानों को पास करने के लिए वैरिएबल सेट करने से रोकते हैं। –

+0

कोई विचार क्यों django व्यवस्थापक इसे पसंद नहीं करते हैं? – Gattster

9

है जोड़ों मेरे 'विचारों' , यह एक बुरा अभ्यास माना जाता है ... लेकिन आप इस

{% with "products" as menu %} 
    {{ menu }} 
{% endwith %} 

कर सकते हैं के बाद से है कि वास्तव में अपने विशिष्ट समस्या यहाँ का समाधान नहीं करता एक संभव आवेदन है ...

<div class='menu'> 
    {% block menuitems %} 
     <a class='{% ifequal menu 'products' %}selected{% endifequal %}' href='/whereever/'>products</a> 
     ... 
    {% endblock %} 
</div> 

और बच्चे टेम्पलेट

{% block menuitems %} 
    {% with 'products' as menu %} 
     {{ block.super }} 
    {% endwith %} 
{% endblock %} 
+1

ओह मैन आपका जवाब मेरा दिन बचाया। मैं django के लिए नया हूँ लेकिन इस सुविधा का इस्तेमाल अन्य ढांचे में किया है। लेकिन कोई अन्य जवाब मेरी क्वेरी से मेल नहीं खाता है। –

+0

धन्यवाद, बहुत अच्छा विचार! – mrash

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