Elevar 404 y continuar con la cadena de URL
-
18-09-2019 - |
Pregunta
Tengo un patrón de URL como este:
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'),
)
los filtered-list
y title
coincidir con las mismas cosas.
Si hay una lista disponible de cosas que coinciden con el tag
en filtered-list
, Quiero list_titles
para disparar. Pero si no hay una coincidencia tag
, Quiero burbujear eso de vuelta al procesador de URL para que así show_title
se dispara.
Si no hay un título coincidente, plantearé un 404 apropiado allí.
Sé que puedo hacer esto desde el interior de la vista ... pero es un poco maloliente tener que alambiar el proceso en la vista. Me gustaría la orden de URL para decidir qué se elige primero y a qué le queda.
Solución
Esto es sin duda una lógica de vista; Todas las urls.py son para los patrones de URL coincidentes, no realizando validación. Puedes usar el Http404
excepción para manejar esto.
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})
Alternativamente, puede encontrar el get_object_or_404
o get_list_or_404
Métodos, que lo acortan un poco.
La edición prometida sigue. No es exactamente lo que estás buscando, pero ...
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),
}