2009-03-18 17 views
13

मान लीजिए कि मेरे पास नीचे एक यूआरएल कॉन्फ़िगर है, और 'foo' और 'bar'page_slug के लिए मान्य मान हैं।अतिरिक्त विकल्पों के साथ Django यूआरएल को रिवर्स करना

urlpatterns = patterns('', 
    (r'^page/(?P<page_slug>.*)/', 'myapp.views.someview'), 
) 

फिर, मैं नीचे दिए गए यूआरएल का पुनर्निर्माण कर सकता हूं, है ना?

>>> from django.core.urlresolvers import reverse 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'}) 
'/page/foo/' 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'}) 
'/page/bar/' 

लेकिन अगर मैं अपना URLconf इस में बदलूं तो क्या होगा?

>>> from django.core.urlresolvers import reverse 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'}) 
'/foo-direct/' 
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'}) 
'/my-bar-page/' 

बहरहाल, यह एक NoReverseMatch अपवाद फेंकता है:

urlpatterns = patterns('', 
    (r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}), 
    (r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}), 
) 

मैं इस परिणाम की उम्मीद। मुझे संदेह है कि मैं कुछ असंभव करने की कोशिश कर रहा हूं। मैं जो चाहता हूं उसे पूरा करने के लिए एक सैनर तरीके से कोई सुझाव?

नामांकित यूआरएल एक विकल्प नहीं हैं, क्योंकि मैं उन अन्य ऐप्स को नहीं चाहता जो इन्हें लिंक करते हैं ताकि URL संरचना (encapsulation और वह सब) के विनिर्देशों के बारे में जान सकें।

+0

आप "काम नहीं करता है" क्या मतलब है? त्रुटि संदेश? यदि ऐसा है तो क्या? –

+0

यह 'NoReverseMatch' अपवाद फेंकता है। –

+0

कृपया नए तथ्यों के साथ प्रश्न अपडेट करें - उपयोगी जानकारी को टिप्पणियों के रूप में न जोड़ें। –

उत्तर

7

यहां हम क्या करते हैं।

urls.py इस

object = SomeModel.objects.get(...) 
    url= reverse('json_someClass_resource', kwargs={'object_id':object.id,'datarealm':object.datarealm.name}) 
+0

मुझे नहीं लगता कि नाम टकराव की समस्या के साथ मदद करता है। –

+0

मैंने मूल रूप से डेविड ने जो कहा था, उसके कारण मैंने आपको नीचे गिरा दिया, लेकिन ऐसा लगता है कि आप वास्तव में जस्टिन के सवाल का जवाब देते हैं। मुझे अभी भी लगता है कि डेविड का जवाब "बेहतर" है, लेकिन आपका एक संभावना है। – Tyson

+0

शायद मुझे समझ में नहीं आया कि यह उपरोक्त पर पहले पढ़ने पर कैसे लागू होता है। मुझे लगता है कि ऐसा लगता है कि यह काम कर सकता है ... लेकिन मॉडल स्तर में यूआरएल नाम का संदर्भ डालने की लागत पर ही। यदि object_1.datarealm.name = 'foo-direct' यह काम करेगा, अगर object_1.datarealm.name = 'foo', यह नहीं होगा। –

4

नाम यूआरएल की तरह रिवर्स कॉल के रूप में इस

url(r'^(?P<datarealm>.*?)/json/someClass/(?P<object_id>.*?)/$', 'json_someClass_resource',), 

views.py तरह पैटर्न है एक विकल्प होना चाहिए। आपका मामला Django संदर्भ में प्रकाश डाला गया है:

http://docs.djangoproject.com/en/dev/topics/http/urls/?from=olddocs#id2

मुझे यकीन है कि डिजाइनरों एक और काम के आसपास छोड़ दिया नहीं हूँ, उन्होंने यूआरएल को कवर करने की उम्मीद की थी।

क्या मैं encapsulation के बारे में digress? धन्यवाद। दो मुख्य कारण हैं: - कोई भी विवरण देखने के लिए चाहता है

  • सुरक्षा -

    1. अमूर्त कोई भी विवरण दिखना चाहिए

    1 के लिए, आप कर सकते हैं के रूप में पाइथन में इसके बाहर माइलेज का एक सभ्य मात्रा प्राप्त करें, और Django एक उत्कृष्ट उदाहरण है। 2 के लिए, यह एक व्याख्या की गई भाषा है। या तो आप इसे कहां चला रहे हैं, या आप संकलित .pyc फ़ाइलों को बंद कर रहे हैं। यदि यह वास्तव में आप क्या कर रहे हैं, तो यूआरएल conf को संकलित करें।

    अंत में, यह अन्य ऐप्स को यूआरएल संरचना की तुलना में कार्यों के बारे में जानने के लिए कम encapsulated लगता है। लेकिन अगर आप वास्तव में असहमत हैं, तो मुझे लगता है कि आपको खुद को एक और अधिक लचीला रिवर्स विधि लागू करना होगा।

  • +0

    सहमत; एपीआई के रूप में नामित यूआरएल निर्यात करना व्यू फ़ंक्शन नाम निर्यात करने के रूप में "encapsulated" जैसा है। –

    +1

    # 2 - अस्पष्टता के माध्यम से सुरक्षा? :( – monokrome

    +0

    मुझे लगता है कि लिंक पुराना है। आप किस अनुभाग से लिंक करना चाहते हैं? –

    19

    आपको अपने urlconfs नामकरण करने का प्रयास करना चाहिए। उदाहरण:

    urlpatterns = patterns('', 
        url(r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}, name='foo-direct'), 
        url(r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}, name='bar-page'), 
    ) 
    

    फिर बस अपने रिवर्स को संपादित करें और आपको इसे काम करना चाहिए।पर

    >>> from django.core.urlresolvers import reverse 
    >>> reverse('foo-direct', kwargs={'page_slug': 'foo'}) 
    '/foo-direct/' 
    >>> reverse('bar-page', kwargs={'page_slug': 'bar'}) 
    '/my-bar-page/' 
    

    और जानकारी: Django Docs

    +0

    प्रश्न में इस तरह की यूआरएल के साथ यह कैसे मदद करता है: (आर '^ पृष्ठ/(? पी । *)/',' myapp.views.someview '),? – Rexford

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