2012-02-16 11 views
17

मान लें कि मेरे पास तीन ऐप्स के साथ एक Django प्रोजेक्ट है: foo, bar, और गोंद। मैं पुन: प्रयोज्य ऐप सम्मेलनों का पालन करने की कोशिश कर रहा हूं, इसलिए फू और बार एक दूसरे पर या गोंद पर निर्भर नहीं हैं (और कुछ भी नहीं जानते)। गोंद में साइट पर अन्य दो ऐप्स को एकीकृत करने के लिए कोड शामिल है।Django: मैं अपने प्रोजेक्ट urlconf में ऐप-सप्लाई यूआरएल कैसे ओवरराइड कर सकता हूं?

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

मेरे परियोजना urlconf इस तरह दिखता है: बार में देखने के लिए

urlpatterns = patterns('', 
    (r'^$', include('glue.urls')), 
    (r'^foo/', include('foo.urls')), 
    (r'^bar/', include('bar.urls')), 
) 

क्या (उस बात के लिए, या किसी अन्य मनमाना दृश्य तर्क) वैकल्पिक टेम्पलेट पारित करने के लिए सबसे खूबसूरत तरीका है? मैं बार के urlconf को सीधे संशोधित नहीं करना चाहता, क्योंकि यह गोंद पर निर्भर करेगा।

include('bar.urls') को हटाने का एकमात्र अन्य तरीका है, प्रोजेक्ट urlconf में बार के urlconf में यूआरएल पैटर्न कॉपी करें, और जिस पैटर्न में मुझे रूचि है, उसे संशोधित करें। यह दृष्टिकोण हालांकि DRY सिद्धांत का उल्लंघन करता है। क्या कोई और समाधान है जिसे मैं याद कर रहा हूं?

उत्तर

23

जाहिर है नकली यूआरएल urlconf में अनुमति दी जाती है, और सूचीबद्ध पहला मैच प्राथमिकता दी जाएगी:

urlpatterns = patterns('', 
    (r'^$', include('glue.urls')), 
    (r'^foo/', include('foo.urls')), 

    # This will override the same URL in bar's urlconf: 
    (r'^bar/stuff/$', 'glue.views.new_bar_stuff', {'arg': 'yarrgh'}, 'bar_stuff'), 

    (r'^bar/', include('bar.urls')), 
) 
2

यह स्पष्ट नहीं है कि तुम क्या कह रहे हैं, लेकिन जैसा कि मैंने यह समझते हैं, आपके सवाल यह है:

पट्टी में दृश्य के लिए वैकल्पिक टेम्पलेट पारित करने के लिए सबसे खूबसूरत तरीका क्या है?

इसका यूआरएल conf के साथ कुछ लेना देना नहीं है, जो सिर्फ यूआरएल को तरीकों से मैप करता है। Django में

टेम्पलेट्स अपने settings.py में TEMPLATE_DIRS में स्थानों से देखा जाता है, और सबसे महत्वपूर्ण Django एक बार यह एक टेम्पलेट पाता देख बंद हो जाएगा।

यदि आपका TEMPLATE_DIRS खाली है (के रूप में डिफ़ॉल्ट है), तो Django टेम्पलेट्स के लिए किसी भी पंजीकृत क्षुधा (INSTALLED_APPS में सूचीबद्ध क्षुधा) के अंदर एक templates निर्देशिका में दिखेगा।

तो, किसी भी एप्लिकेशन के लिए वैकल्पिक टेम्पलेट पास करने के लिए, बस TEMPLATE_DIRS में सूचीबद्ध निर्देशिका में एक ही नाम (और निर्देशिका संरचना) वाली फ़ाइल बनाएं। Django पहले यह खोज करेगा, और जब यह एक मैच पाता है तो रोकें।

यह वही तरीका है जिससे आप डिफ़ॉल्ट व्यवस्थापक टेम्पलेट को ओवरराइड करते हैं।

अपने विशेष मामले के लिए, मान लें कि आप index.html के वैकल्पिक संस्करण को bar पर वैकल्पिक संस्करण पास करना चाहते हैं।

अपनी परियोजना पथ में कहीं भी override_templates निर्देशिका बनाएं।

इसके अंदर bar/templates/ निर्देशिका बनाएं, और इस निर्देशिका में अपना अनुकूलित index.html जोड़ें, इसलिए आपके पास override_templates/bar/templates/index.html है।

से TEMPLATE_DIRS पर settings.py में पूरा पथ जोड़ें।

अब डीजेंगो पहले अनुरोध किए गए किसी भी टेम्पलेट के लिए आपकी कस्टम निर्देशिका खोजेगा, और आपके वैकल्पिक index.html को लोड करेगा।

+2

मैं इस दृष्टिकोण पर ध्यान देंगे, लेकिन यह मैं के लिए काफी क्या देख रहा हूँ नहीं है। क्या होगा अगर मैं दृश्य के लिए किसी अन्य तर्क में गुजरना चाहता हूं? दृश्य urlconf में बुलाया जाता है, इसलिए तर्क को पारित करने के लिए तार्किक स्थान की तरह लगता है। –

+0

आप दृश्य में मनमाना तर्क पारित करना चाहते हैं? कृपया अपने प्रश्न स्पष्ट करें। –

+1

हां, उन तर्कों के समान जो आप urlconf से सामान्य दृश्य में पास करेंगे। –

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

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