2009-08-19 7 views
20

J'ai un modèle d'URL comme ceci:Raise 404 et continuer la chaîne 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'), 
) 

Le match filtered-list et title les mêmes choses.

S'il y a une liste de choses disponibles correspondant au tag dans filtered-list, je veux que list_titles s'éteigne. Mais s'il n'y a pas de tag correspondant, je veux ramener le tout au processeur d'URL, donc show_title se déclenche.

S'il n'y a pas de titre correspondant, j'élèverai un 404 approprié là.

Je sais que je peux le faire depuis l'intérieur de la vue ... mais il est un peu difficile d'avoir à câbler le processus dans la vue. Je voudrais que l'ordre de l'URL décide de ce qui est choisi en premier et de ce que cela signifie.

Répondre

30

Il s'agit certainement d'une logique de vue; Tous urls.py est pour est pour les motifs d'URL correspondants, ne pas effectuer de validation. Vous pouvez utiliser l'exception Http404 pour gérer cela.

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

Vous pouvez également trouver les get_object_or_404 ou get_list_or_404 méthodes qui raccourcissent un peu.


L'édition promis suit. Pas exactement ce que vous cherchez, mais ...

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

merci pour get_list_or_404 mais ce n'est pas une réponse à ma question. Je dis que si je ne peux pas obtenir une liste de titres basée sur l'URL, je veux que l'URL soit réévaluée par le reste des URL. – Oli

+0

Hmm ... Je vois. Votre question initiale n'était pas très claire. Rappelez-vous que l'urls.py est juste du code Python, donc vous pouvez y faire une sorte de validation. Donnez-moi une minute et je vais éditer ma réponse. –

+1

'raise Http404' devrait probablement être' raise Http404() ': https://docs.djangoproject.com/fr/2.0/topics/http/views/#the-http404-exception –