Raccogli 404 e continua la catena URL
-
18-09-2019 - |
Domanda
Ho un modello URLS come questo:
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'),
)
Il filtered-list
e title
Abbina le stesse cose.
Se c'è un elenco disponibile di cose che corrispondono al tag
in filtered-list
, Voglio list_titles
per sparare. Ma se non c'è una corrispondenza tag
, Voglio ribaltarlo al processore URL così show_title
spara.
Se non c'è un titolo corrispondente, alzerò un 404 appropriato lì.
So di poterlo fare dall'interno della vista ... ma è un po 'puzzolente dover durare il processo nella vista. Vorrei l'ordine dell'URL di decidere cosa viene scelto per primo e cosa si allontana.
Soluzione
Questa è certamente la logica di visualizzazione; Tutti gli URLS.PY sono per i modelli di URL corrispondenti, non eseguendo la convalida. Puoi usare il Http404
Eccezione per gestire questo.
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})
In alternativa, potresti trovare il get_object_or_404
o get_list_or_404
Metodi, che lo accorciano un po '.
Segue la modifica promessa. Non esattamente quello che stai cercando, ma ...
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),
}