2009-04-27 7 views
30

लघु संस्करण:Django: मैं टेम्पलेट से कॉलिंग व्यू को कैसे पहचान सकता हूं?

वहाँ एक सरल, निर्मित अतिरिक्त संदर्भ चर गुजर बिना, एक Django टेम्पलेट में बुला दृश्य पहचान करने के लिए रास्ता नहीं है?

लांग (मूल) संस्करण:

मेरी Django एप्लिकेशन में से एक कई अलग अलग दृश्य दिखाई देते हैं, अपने स्वयं के नाम पर रखा गया URL पैटर्न के साथ प्रत्येक, बस इतना ही प्रस्तुत करना ही टेम्पलेट। टेम्पलेट कोड की एक बहुत छोटी मात्रा है जिसे कॉल किए गए दृश्य के आधार पर बदलने की जरूरत है, प्रत्येक दृश्य के लिए अलग-अलग टेम्पलेट्स सेट करने के ओवरहेड के लायक होने के लिए बहुत छोटा है, इसलिए आदर्श रूप से मुझे टेम्पलेट में कॉलिंग व्यू को पहचानने का तरीका ढूंढना होगा ।

मैं अतिरिक्त संदर्भ चर में पारित करने के लिए (उदाहरण के लिए "VIEW_NAME") बुला दृश्य पहचान करने के लिए दृश्य सेट अप कर लिया है की कोशिश की है, और मैं भी {% ifequal request.path "/some/path/" %} तुलना उपयोग करने की कोशिश की है, लेकिन इनमें से कोई समाधान विशेष रूप से सुंदर लगती है। क्या टेम्पलेट से कॉलिंग व्यू को पहचानने का कोई बेहतर तरीका है? क्या दृश्य के नाम, या यूआरएल पैटर्न का नाम एक्सेस करने का कोई तरीका है?


अद्यतन 1: टिप्पणी है कि इस बस मुझे MVC गलतफहमी का एक मामला है के बारे में, मैं MVC समझते हैं, लेकिन Django's not really an MVC framework। मेरा मानना ​​है कि जिस तरह से मेरा ऐप स्थापित किया गया है, वह डीजेंगो के एमवीसी पर ले जाने के अनुरूप है: विचार का वर्णन करते हैं जो डेटा प्रस्तुत किया गया है, और टेम्पलेट्स डेटा का विवरण का वर्णन करता है। ऐसा होता है कि मेरे पास कई विचार हैं जो अलग-अलग डेटा तैयार करते हैं, लेकिन यह सभी एक ही टेम्पलेट का उपयोग करते हैं क्योंकि डेटा सभी विचारों के लिए समान तरीके से प्रस्तुत किया जाता है। यदि यह मौजूद है, तो मैं टेम्पलेट से कॉलिंग व्यू को पहचानने का एक आसान तरीका ढूंढ रहा हूं।

अद्यतन 2: सभी उत्तरों के लिए धन्यवाद। मुझे लगता है कि सवाल पर विचार किया जा रहा है - जैसा कि मेरे मूल प्रश्न में बताया गया है, मैंने पहले से ही सभी सुझाए गए समाधानों पर विचार किया है और कोशिश की है - इसलिए मैंने इसे प्रश्न के शीर्ष पर अब "लघु संस्करण" में डिस्टिल्ड कर दिया है । और अभी ऐसा लगता है कि अगर कोई "पोस्ट" पोस्ट करना था, तो यह सबसे सही जवाब होगा :)

अपडेट 3: कार्ल मेयर ने "नहीं" पोस्ट किया :) धन्यवाद, हर कोई।

+0

मुझे यकीन नहीं है कि क्या मैं एक कारण के बारे में सोच सकता हूं कि अलग-अलग विचारों को एक ही टेम्पलेट को क्यों कॉल किया जाना चाहिए? क्या आप विस्तार से समझा सकते हैं? मुझे लगता है कि यह एक मामला हो सकता है कि आपने एमवीसी अवधारणा को गलत समझा है – Mez

+0

टिप्पणी के लिए धन्यवाद। प्रत्येक विचार एक अलग ओआरएम क्वेरी करता है, लेकिन सभी आउटपुट एक ही प्रारूप में हैं, इसलिए DRY के लिए आम टेम्पलेट। मैंने आगे के विवरण के साथ प्रश्न संपादित किया है। – bryan

+2

मैं टेम्पलेट में एक अतिरिक्त संदर्भ चर पारित करने के साथ जाऊंगा। सरल, नो-ब्रेनर समाधान। क्यों नहीं? – codeape

उत्तर

15

नहीं है, और यह एक बुरा विचार किया जाएगा। टेम्पलेट से दृश्य फ़ंक्शन नाम को सीधे संदर्भित करने के लिए दृश्य परत और टेम्पलेट परत के बीच अत्यधिक तंग युग्मन प्रस्तुत किया जाता है। यहाँ

एक बहुत बेहतर समाधान Django के टेम्पलेट विरासत प्रणाली है। प्रत्येक दृश्य के संस्करण में बदलने की आवश्यकता वाले छोटे (छोटे) क्षेत्र के लिए एक ब्लॉक के साथ एक सामान्य अभिभावक टेम्पलेट को परिभाषित करें। फिर माता-पिता से विस्तार करने के लिए प्रत्येक दृश्य के टेम्पलेट को परिभाषित करें और उस ब्लॉक को उचित रूप से परिभाषित करें।

+0

धन्यवाद, कार्ल। जैसा कि मेरे मूल प्रश्न में बताया गया है, मैं अधिक टेम्पलेट्स बनाने से बचना चाहता था क्योंकि टेम्पलेट अंतर बहुत मामूली हैं, लेकिन यह विधि सबसे अधिक समझ में आता है। – bryan

+0

दरअसल, मैं दृश्य नाम के आधार पर सामग्री तत्व में सीएसएस कक्षा जोड़ने के बारे में सोच रहा था, लेकिन आप युग्मन के संबंध में सही हो सकते हैं। –

0

एक सरल उपाय है:

def view1(req): 
    viewname = "view1" 
    and pass this viewname to the template context 

def view2(req): 
    viewname = "view2" 
    and pass this viewname to the template context 
टेम्पलेट का उपयोग कर सकते में

VIEWNAME रूप

{{viewname}} 

और भी आप तुलना में इस का उपयोग कर सकते हैं।

+1

धन्यवाद उत्तर के लिए, लेकिन जैसा कि मूल प्रश्न में उल्लेख किया है, मैं पहले से ही है कि कोशिश की और कर रहा हूँ गया है यदि यह मौजूद है तो बेहतर तरीके से खोज रहे हैं। – bryan

-1

सत्र कुकी सेट अप करने का प्रयास क्यों नहीं करें, फिर कुकी को अपने टेम्पलेट से पढ़ें।

अपने दृश्यों पर

कुकीज़

def view1(request): 
... 
#set cookie 
request.session["param"]="view1" 

def view2(request): 
    request.session["param"]="view2" 


then in your ONE template check something like.. 

{% ifequal request.session.param "view1" %} 
    ... do stuff related to view1 
{% endifequal %} 

{% ifequal request.session.param "view2" %} 
    ... do stuff related to "view2" 
{% endifequal %} 

गत

+9

धन्यवाद, लेकिन मैं जटिलता को कम करने के लिए है, यह वृद्धि :) – bryan

1

यह एक सामान्य विचार है कि आप सेट कर सकते हैं का आदर्श उदाहरण की तरह लगता है की स्थापना की।

निम्न संसाधनों देखें:

ये लिंक आपको उसके अनुसार विचारों और अपने टेम्पलेट को आसान बनाने में मदद करनी चाहिए।

+0

धन्यवाद नहीं देख रहा हूँ, लेकिन मेरे विचार वास्तव में पहले से ही सामान्य विचारों का विस्तार कर रहे हैं। या आप सुझाव दे रहे हैं कि मैं अपना खुद का सामान्य विचार लिखता हूं? – bryan

+0

उदाहरण, http://www.djangobook.com/en/2.0/chapter11/#cn41 के लिए, 'extra_context' टेम्पलेट में भेजा जाता है। यह आपकी समस्या का एक आसान समाधान होना चाहिए। किसी फ़ंक्शन को परिभाषित करें, या अपने 'अतिरिक्त संदर्भ' में डेटा के साथ पास करने के लिए अंतर्निहित विधियों का उपयोग करें ताकि आप इसे अपने टेम्पलेट के भीतर तुलना कर सकें। –

+1

धन्यवाद, लेकिन जैसा कि मेरे मूल प्रश्न में बताया गया है, मैंने पहले से ही कोशिश की है, और हाँ मुझे पता है कि यह काम करता है। ऐसा लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए। मुझे लगता है कि मेरा प्रश्न नीचे उबलता है: क्या टेम्पलेट से कॉलिंग व्यू तक पहुंचने का एक अंतर्निहित तरीका है। – bryan

1

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

request.resolver_match.url_name 

इससे पहले, आप उसके लिए एक Middleware उपयोग कर सकते हैं:

19

Django 1.5 के बाद से, url_name का उपयोग कर पहुँचा जा सकता है

from django.core.urlresolvers import resolve 

class ViewNameMiddleware(object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
     url_name = resolve(request.path).url_name 
     request.url_name = url_name 

फिर MIDDLEWARE_CLASSES में यह जोड़ने, और टेम्पलेट्स में मेरे पास है इस:

{% if request.url_name == "url_name" %} ... {% endif %} 

एक RequestContext (अनुरोध) पर विचार हमेशा पारित हो जाता है प्रस्तुत करने के लिए समारोह। मैं यूआरएल के लिए url_name का उपयोग करना पसंद करता हूं, लेकिन कोई संकल्प()। App_name और resol()। Func.name का उपयोग कर सकता है, लेकिन यह सजावटी के साथ काम नहीं करता है - सजावटी फ़ंक्शन का नाम बदले में वापस कर दिया जाता है।

+0

वास्तव में इस मिडलवेयर की आवश्यकता नहीं है के रूप में अनुरोध पहले ही हल url_name => request.resolver_match.url_name –

+5

नोट के लिए धन्यवाद प्रदान करता है। वास्तव में, 'request.resolver_match' 2013 में Django 1.5 में पेश किया गया था, जबकि पद 2012 से है वहाँ StackOverflow :) – Tisho

+1

में 'अप्रचलित' के लिए एक ध्वज' request.resolver_match.url_name' टेम्पलेट्स 'Django में उपयोग करने के लिए होना चाहिए। 'TEMPLATE_CONTEXT_PROCESSORS' को सेट करने के लिए core.context_processors.request' को जोड़ा जाना चाहिए। – juliocesar

1

Django 1.5 जब से तुम request.resolver_match के माध्यम से ResolverMatch का एक उदाहरण का उपयोग कर सकते हैं।

ResolverMatch आप हल हो गई यूआरएल नाम, नामस्पेस, आदि

+0

धन्यवाद, मैं 'view_name' की पहचान करने के लिए खोज रहा था! – tbolender

0

अधिकांश सामान्य दृश्य देता है - नहीं सभी अगर - ContextMixin जो एक view संदर्भ चर कि देखें उदाहरण के लिए अंक कहते हैं इनहेरिट करती है।

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