2009-08-19 11 views
20

ich ein URLs Muster wie diese haben:Raise 404 und weiterhin die URL Kette

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'), 
) 

Die filtered-list und title Spiel die gleichen Dinge.

Wenn es eine Liste von Dingen gibt, die zu der tag in filtered-list passen, möchte ich list_titles abfeuern. Aber wenn es kein passendes tag gibt, möchte ich das zurück zum URL Prozessor sprudeln, also show_title feuert weg.

Wenn es keinen übereinstimmenden Titel gibt, werde ich dort einen richtigen 404 auslösen.

Ich weiß, dass ich dies aus der Sicht tun kann ... aber es ist ein bisschen stinkend, den Prozess in die Ansicht zu verdrahten. Ich möchte, dass die Reihenfolge der URLs entscheidet, was zuerst ausgewählt wird und wohin es geht.

Antwort

30

Dies ist sicherlich Ansichtslogik; Alle urls.py dient dazu, passende URL-Muster zu finden und keine Validierung durchzuführen. Sie können dazu die Http404-Ausnahme verwenden.

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}) 

Alternativ können Sie die get_object_or_404 oder get_list_or_404 Methoden finden, die es ein wenig verkürzen auf.


Versprochen Edit folgt. Nicht genau was du suchst, aber ...

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

danke für get_list_or_404 aber das ist keine Antwort so sehr auf meine Frage. Ich sage, wenn ich keine Liste von Titeln basierend auf der URL erhalten kann, möchte ich, dass die URL über den Rest der URLs neu bewertet wird. – Oli

+0

Hmm ... Ich verstehe. Ihre ursprüngliche Frage war nicht sehr klar. Denken Sie daran, dass urls.py nur Python-Code ist, so dass Sie dort eine Art Validierung durchführen können. Gib mir eine Minute und ich werde meine Antwort bearbeiten. –

+1

'raise Http404' sollte wahrscheinlich' raise Http404() ': https://docs.djangoproject.com/en/2.0/topics/http/views/#the-http404-exception sein –