2009-06-21 17 views
7

बोल्ड करने का एक बेहतर तरीका है मेरे पास base.html टेम्पलेट है जिसमें लिंक की एक सूची है।Django: क्या वर्तमान पृष्ठ लिंक

उदाहरण:

<div id="sidebar1"> 
     <ul> 
     <li><a href="/" title="">Index</a></li> 
     <li><a href="/stuff/" title="" class="current">Stuff</a></li> 
     <li><a href="/about/" title="">About Me</a></li> 
     <li><a href="/contact/" title="">Contact Me</a></li> 
    </div> 

तब मैं अपने views.py में index.html, stuff.html, about.html और से संपर्क से प्रत्येक के लिए एक परिभाषा नहीं है। उनमें से प्रत्येक टेम्पलेट बस base.html टेम्पलेट से प्राप्त होता है और अपने संबंधित शीर्षक और सामग्री सेट करता है।

मेरा प्रश्न उपर्युक्त/सामान के बारे में है जो मेरे पास कक्षा = "वर्तमान" है।

मैं वर्तमान पृष्ठ बनाना चाहता हूं जिसमें मेरे पास उस क्लास विशेषता है।

मैं प्रत्येक दृश्य में एक अलग चर सेट कर सकता हूं जैसे current_page = "about" और फिर प्रत्येक लिंक के प्रत्येक वर्ग तत्व में {% ifequal %} के साथ टेम्पलेट में तुलना करें, लेकिन ऐसा लगता है कि डुप्लिकेटिंग कार्य (अतिरिक्त दृश्य चर के कारण))।

क्या कोई बेहतर तरीका है? हो सकता है कि दृश्य फ़ंक्शन नाम प्राप्त करने का कोई तरीका है कि टेम्पलेट स्वचालित रूप से भर गया था, तो मुझे अतिरिक्त चर सेट करने की आवश्यकता नहीं होगी? यह भी कई असमानताओं की तरह प्रतीत होता है।

उत्तर

16

ऐसा करने का एक शानदार तरीका है, जिसे मैंने कहीं से कॉपी किया है और मैं केवल यही चाहता हूं कि मुझे याद आए, इसलिए मैं उन्हें क्रेडिट दे सकता था। 8-)

मैं अपने पृष्ठ (या एक वर्ग के सभी पृष्ठों) इस तरह से प्रत्येक के लिए एक id आवंटित:

In index.html: <body id='section-intro'>... 
In faq.html:  <body id='section-faq'>... 
In download.html: <body id='section-download'>... 

और फिर इसी लिंक के लिए एक id:

<li id='nav-intro'><a href="./">Introduction</a></li> 
<li id='nav-faq'><a href="./faq.html">FAQ</a></li> 
<li id='nav-download'><a href="./download.html">Download</a></li> 

और सीएसएस में मैंने इस तरह का नियम निर्धारित किया:

#section-intro #nav-intro, 
#section-faq #nav-faq, 
#section-download #nav-download { 
    font-weight: bold; 
    /* And whatever other styles the current link should have. */ 
} 

तो यह वर्तमान पृष्ठ में मौजूद लिंक की शैली को नियंत्रित करने के लिए सबसे अधिक घोषणात्मक तरीके से काम करता है। आप इसे यहां क्रिया में देख सकते हैं: http://entrian.com/source-search/

यह सेट करने के बाद यह एक बहुत ही साफ और सरल प्रणाली है, क्योंकि:

  • आप अपने लिंक
  • आप बड़ा बदसूरत switch बयान या if/else/else बयान
  • एक वर्ग के लिए पृष्ठों को जोड़ने से बस काम करता है [TM] का उपयोग न करना पड़े में टेम्पलेट मार्कअप के साथ के बारे में गड़बड़ करने की जरूरत नहीं
  • चीजों को बदलने का तरीका बदलना हमेशा सीएसएस को बदलना है, मार्कअप नहीं।

मैं Django का उपयोग नहीं कर रही है, लेकिन इस प्रणाली कहीं भी काम करता है। आपके मामले में, जहां आप "अपने स्वयं के संबंधित शीर्षक और सामग्री सेट करते हैं" आपको body id सेट करने की भी आवश्यकता है, और कोई अन्य Django मार्कअप आवश्यक नहीं है।

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

#section-download #sidebar #download-link { 
    display: none; 
} 

+0

हालांकि इस सीएसएस डुप्लिकेट सामग्री का एक बहुत मतलब यह नहीं है: वर्तमान पृष्ठ की जाँच करता है, तो पथ लिंक के गंतव्य से मेल खाता है, जैसे कि, आप पहले से ही वहाँ हो का एक सरल बात है पर प्रकाश डाला? –

+0

... मेरा मतलब है प्रत्येक लिंक आईडी के लिए शैली। –

+0

यह प्रत्येक पृष्ठ/अनुभाग के लिए सीएसएस की एक पंक्ति है। शैली केवल एक बार दिखाई देती है, इसके पहले सेक्शन/एनएवी जोड़े की अल्पविराम से अलग सूची के साथ। – RichieHindle

2

Django उपयोग नहीं किया है, लेकिन मैं में एक ही मुद्दा साथ पेश किया है: "आप इस तरह कर सकते हैं कि सीएसएस में। Kohana (PHP) और रेल

क्या मैं Kohana में कार्य करें:।

<li><a href="/admin/dashboard" <?= (get_class($this) == 'Dashboard_Controller') ? "class=\"active\"" : NULL ?>>Dashboard</a></li> 
<li><a href="/admin/campaigns" <?= (get_class($this) == 'Campaigns_Controller') ? "class=\"active\"" : NULL ?>>Campaigns</a></li> 
<li><a href="/admin/lists" <?= (get_class($this) == 'Lists_Controller') ? "class=\"active\"" : NULL ?>>Lists</a></li> 

क्या मैं रेल में कार्य करें:

<li><a href="/main" <%= 'class="active"' if (controller.controller_name == 'main') %>>Overview</a></li> 
<li><a href="/notifications" <%= 'class="active"' if (controller.controller_name == 'notifications') %>>Notifications</a></li> 
<li><a href="/reports" <%= 'class="active"' if (controller.controller_name == 'reports') %>>Reports</a></li> 
1

मैं इसे करने के तरीके का केवल एक जोड़े को देखते हैं, जबकि दोहराया ifequals परहेज:

  1. जावास्क्रिप्ट। की तर्ज पर कुछ (jQuery):

    var parts = window.location.pathname.split('/'); 
    var page = parts[parts.length-1]; 
    $('#sidebar1 a[href*=' + page + ']').addClass('current'); 
    
  2. अपने विचार बदलें उनके संबद्ध शीर्षक और URL के साथ पृष्ठों की एक सूची शामिल करने के लिए और अपने खाके में पाश एक {% के ​​लिए%} बनाने के लिए, जो कि के माध्यम से जाना होगा सूची, और एक एकल {% ifequal%} जोड़ें।

विकल्प 2 जहां से मैं खड़ा हूं वहां से पसंदीदा हूं। यदि आपके सभी पृष्ठों के लिए तर्क समान है, और केवल टेम्पलेट भिन्न हैं, तो आप अपने प्रत्येक पृष्ठ के लिए FlatPages मॉडल का उपयोग करने पर विचार कर सकते हैं। यदि तर्क अलग है, और आपको विभिन्न मॉडलों की आवश्यकता है, तो आप किसी प्रकार के मेनूिंग ऐप का उपयोग करने पर विचार कर सकते हैं। एक बेशर्म प्लग: मैं एक menuing app of my own

1

है आप request संदर्भ प्रोसेसर जोड़ते हैं, तो यह बहुत सीधा है:

settings.py: 

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request', 
    'django.contrib.auth.context_processors.auth' # admin app wants this too 
) 

अब आप HttpRequest, जो अनुरोध पथ की पहुंच है।

<li><a class="{% if request.path == '/' %}current{% endif %}" href="/">Index</a></li> 
<li><a class="{% if request.path == '/stuff/' %}current{% endif %}" href="/stuff/">Stuff</a></li> 
<li><a class="{% if request.path == '/about/' %}current{% endif %}" href="/about/">About Me</a></li> 
<li><a class="{% if request.path == '/contact/' %}current{% endif %}" href="/contact/">Contact Me</a></li> 
संबंधित मुद्दे