2009-08-19 13 views
20

मैं इस तरह एक यूआरएल पैटर्न मिल गया है जारी रखने के लिए:404 उठाएँ और URL चेन

urlpatterns = (
    url(r'^$', list_titles, name='list'), 
    url(r'^(?P<tag>[a-z\-0-9]+?)/$', list_titles, name='filtered-list'), 
    url(r'^(?P<title>\S+?)/$', show_title, name='title'), 
) 

filtered-list और title मैच एक ही बातें।

से filtered-list में मेल खाने वाली चीज़ों की एक उपलब्ध सूची है, तो मुझे list_titles आग लगाना चाहिए। लेकिन अगर tag से मेल नहीं खाता है, तो मैं इसे यूआरएल प्रोसेसर पर वापस बुलबुला करना चाहता हूं ताकि show_title आग लग जाए।

यदि कोई मिलान करने वाला शीर्षक नहीं है, तो मैं वहां उचित 404 उठाउंगा।

मुझे पता है कि मैं इसे दृश्य के अंदर से कर सकता हूं ... लेकिन यह थोड़ा सा सुगंधित है जिससे प्रक्रिया को हार्ड-वायर किया जा सकता है। मैं यूआरएल ऑर्डर करना चाहता हूं कि यह तय करने के लिए कि पहले क्या चुना जाता है और यह किस तरह से बंद हो जाता है।

उत्तर

30

यह निश्चित रूप से तर्क देखें; सभी urls.py के लिए यूआरएल पैटर्न मिलान करने के लिए है, सत्यापन नहीं कर रहा है। आप इसे संभालने के लिए Http404 अपवाद का उपयोग कर सकते हैं।

from django.http import Http404 

def detail(request, poll_id): 
    try: 
     p = Poll.objects.get(pk=poll_id) 
    except Poll.DoesNotExist: 
     raise Http404 
    return render_to_response('polls/detail.html', {'poll': p}) 

वैकल्पिक रूप से, आप get_object_or_404 या get_list_or_404 तरीकों, जो इसे थोड़ा छोटा मिल सकता है।


वादा संपादित इस प्रकार है। बिल्कुल वही नहीं जो आप खोज रहे हैं, लेकिन ...

urlpatterns = (
    url(r'^$', list_titles, name='list'), 
) 

if 1=1: # Your logic here 
    urlpatterns += (url(r'^$', list_titles, name='list'),) 

urlpatterns += (
    url(r'^(?P<title>\S+?)/$', show_title, name='title'), 
    url(r'^spam/$', spam_bar), 
    url(r'^foo/$', foo_bar), 
} 
+0

get_list_or_404 के लिए धन्यवाद लेकिन यह मेरे प्रश्न के लिए इतना जवाब नहीं है। मैं कह रहा हूं कि अगर मुझे यूआरएल के आधार पर खिताब की सूची नहीं मिल रही है, तो मैं चाहता हूं कि यूआरएल को बाकी यूआरएल के माध्यम से फिर से मूल्यांकन किया जाए। – Oli

+0

हम्म ... मैं देखता हूं। आपका मूल प्रश्न बहुत स्पष्ट नहीं था। याद रखें कि urls.py सिर्फ पायथन कोड है, इसलिए आप वहां कुछ प्रकार की सत्यापन कर सकते हैं। मुझे एक मिनट दें और मैं अपना जवाब संपादित करूंगा। –

+1

'बढ़ा Http404' शायद' होना चाहिए Http404 उठाना() ': https://docs.djangoproject.com/en/2.0/topics/http/views/#the-http404-exception –