Augmenter 404 et poursuivre la chaîne d'URL
-
18-09-2019 - |
Question
J'ai un modèle URL comme ceci:
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'),
)
La filtered-list
et title
Faites correspondre les mêmes choses.
S'il y a une liste disponible de choses correspondant à la tag
dans filtered-list
, Je veux list_titles
se déclencher. Mais s'il n'y a pas de correspondance tag
, Je veux bouillonner cela au processeur d'URL donc show_title
tire.
S'il n'y a pas de titre correspondant, j'y augmenterai un 404 approprié.
Je sais que je peux le faire de l'intérieur de la vue ... mais c'est un peu malodorant d'avoir à percer dure le processus dans la vue. J'aimerais l'ordre d'URL pour décider de ce qui est choisi en premier et de ce à quoi il vous rend.
La solution
C'est certainement la logique de voir; Toutes les urls.py sont destinées aux modèles d'URL correspondant, sans effectuer une validation. Vous pouvez utiliser le Http404
exception 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})
Alternativement, vous pouvez trouver le get_object_or_404
ou get_list_or_404
Méthodes, qui le raccourcissent un peu.
La modification promise 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),
}