5

मैं नेविगेशन मेनू में वर्तमान पृष्ठ को हाइलाइट करना चाहता हूं। स्पष्ट रूप से मुझे मेन्यू को अपने पृष्ठ पर होने पर 'सक्रिय' जैसी कक्षा को लिंक करने की आवश्यकता है। यह एक क्लासिक समस्या है और मैंने कई समाधान proposed देखा है। मेरी समस्या यह है कि मैं उन सभी से नफरत करता हूं और उनमें से कोई भी बहुत शुष्क होने पर विचार नहीं करता हूं। उदाहरण के लिए:पृथ्वी पर क्यों मुझे अपने सभी प्रतिक्रियाओं में RequestContext पास करना है?

@register.simple_tag 
def active(request, pattern): 
    import re 
    if re.search(pattern, request.path): 
     return 'active' 
    return '' 

---- 

{% load tags %} 
<div id="navigation"> 
    <a class="{% active request "^/about/" %}" href="/about/">About</a> 
    <a class="{% active request "^/contact/" %}" href="/contact/">Contact</a> 
    <a class="{% active request "^/services/" %}" href="/services/">Services</a> 
</div> 

टैग को अपने वर्तमान अनुरोध और एक यूआरएल अभिव्यक्ति और रिटर्न 'सक्रिय' अगर आप इस पेज पर वर्तमान में कर रहे हैं लगता है। वैकल्पिक रूप से यह यूआरएल के बजाए नामित विचारों के साथ किया जा सकता है लेकिन सिद्धांत समान है।

:

इस के साथ मेरा मुख्य मुद्दा यह है कि मेरे नेविगेशन अपने विचार के 99% और पर बुलाया जाएगा अभी तक, आदेश वर्तमान अनुरोध चर मैं अभी भी कुछ इस तरह के साथ टेम्पलेट के लिए एक RequestContext पार्स है प्राप्त करने के लिए है

def contact(request): 
    # snip ... 
    return render_to_response(
       'contact.html', 
       { 'myvar' : myvar }, 
       context_instance=RequestContext(request)) 

मुझे अपने विचारों में से हर एक जब शायद करने के लिए इस context_instance लाइन जोड़ने की जरूरत है सभी उनमें से एक आदेश वर्तमान यूआरएल/दृश्य सक्रिय लिंक को उजागर करने के प्राप्त करने के लिए अनुरोध चर की जरूरत है, लेकिन? यह बहुत गीला लगता है, खासतौर पर ऐसी सुविधा के लिए जो डीजेंगो साइटों के विशाल बहुमत में होना चाहिए। मैं डिफ़ॉल्ट रूप से अनुरोध को शामिल करना चाहता हूं और इसे वैकल्पिक रूप से दबाने में सक्षम हूं। मुझे मिडलवेयर में ऐसा करने का कोई तरीका नहीं मिल रहा है क्योंकि दृश्य को वापस करने के बाद इसे प्रस्तुत करने से पहले टेम्पलेट को अवरुद्ध नहीं कर सकता।

कोई सुझाव?

उत्तर

16

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

from annoying.decorators import render_to 

@render_to('template.html') 
def foo(request):   
    bar = Bar.object.all() 
    return {'bar': bar}  
+1

@render_to सजावट शानदार है! धन्यवाद! @render_to की सिफारिश के लिए – Jimmy

+0

+1! ध्यान दें कि [django-annoying] (https://github.com/skorokithakis/django-annoying) को 4 साल बाद निष्क्रियता – antiplex

+2

और Django 1 के कारण ले जाया गया है।5 ने 'direct_to_template' को हटा दिया है। Django-annoying का उपयोग किए बिना, ऐसा करने के लिए अब अनुशंसित तरीका क्या होगा – Patrick

1

वर्तमान में एक अलग शैली देने के लिए आपको अपने नेविगेशन के मार्कअप पर कुछ भी करने की ज़रूरत नहीं है - सीएसएस का उपयोग करके ऐसा करने के लिए घोषणात्मक तरीके हैं।

मेरा उत्तर यहां देखें: Django: Is there a better way to bold the current page link उदाहरण के लिए।

+0

बॉडी आईडी के साथ अपने पृष्ठों का नामकरण करना एक अच्छा विचार है, लेकिन नेविगेशन के साथ शरीर टैग मूल टेम्पलेट में है। मैं इसे बाहर कर सकता हूं और प्रत्येक विस्तारित टेम्पलेट में * {% ब्लॉक body_id%} my-page {% endblock%} * जोड़ सकता हूं लेकिन फिर, DRY कहां है? क्या इसे स्वचालित करने का कोई तरीका है? मैं या तो नामित दृश्य को बॉडी आईडी के रूप में उपयोग करना चाहता हूं या इसे स्पष्ट रूप से नाम देने के बजाय इसे या किसी चीज़ को स्लगिफा करना चाहता हूं और प्रत्येक दृश्य के लिए दो अलग-अलग 'नाम' बनाए रखना है: एक दृश्य के लिए और एक के लिए सीएसएस आईडी – Jimmy

+0

मेरा Django-fu जंगली है, लेकिन प्रत्येक विस्तारित टेम्पलेट को बदलने के बजाय, आप सीएसएस नाम से संपर्क() और परिवार से पास कर सकते हैं: def contact (request): render_to_response ('contact.html', {'cssClass': ' संपर्क पृष्ठ ',' myvar ': myvar}, ...)? अभी भी पूरी तरह से DRY नहीं, लेकिन बुरा नहीं है। – RichieHindle

0

भविष्य में संदर्भ के लिए एक कर क्या ओ पी चाहता था के लिए django-tabs उपयोग कर सकते हैं: समाधान, सरल है render_to_response उपयोग direct_to_template शॉर्टकट के बजाय:

from django.views.generic.simple import direct_to_template 

def contact(request): 
    # snip ... 
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar }) 

... या django-annoying से render_to डेकोरेटर।

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