2009-08-19 19 views
20

Tengo un patrón de URL como esta:Levante 404 y continuar la cadena 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'), 
) 

El partido filtered-list y title las mismas cosas.

Si hay una lista disponible de cosas que coinciden con tag en filtered-list, quiero list_titles para disparar. Pero si no hay un tag que coincida, quiero enviar un mensaje de burbuja al procesador de URL para que show_title se desactive.

Si no hay un título que coincida, subiré un 404 adecuado allí.

Sé que puedo hacer esto desde el interior de la vista ... pero tiene un mal olor tener que conectar el proceso a la vista. Me gustaría que el orden de la URL decidiera primero qué es lo que se elige y a qué se lo transfiere.

Respuesta

30

Esto es ciertamente lógica de vista; todo lo que urls.py es para es para hacer coincidir patrones de URL, sin realizar la validación. Puede usar la excepción Http404 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, es posible que los get_object_or_404 o get_list_or_404 métodos, que acortarlo un poco.


Prometida editar siguiente. No es exactamente lo que está 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), 
} 
+0

gracias por get_list_or_404 pero esta no es una respuesta tanto a mi pregunta. Estoy diciendo que si no puedo obtener una lista de títulos basados ​​en la URL, quiero que la URL se vuelva a evaluar a través del resto de las URL. – Oli

+0

Hmm ... Ya veo. Tu pregunta original no era terriblemente clara. Recuerde que urls.py es solo código Python, por lo que puede hacer algún tipo de validación allí. Dame un minuto y voy a editar mi respuesta. –

+1

'raise Http404' debería ser probablemente' raise Http404() ': https://docs.djangoproject.com/en/2.0/topics/http/views/#the-http404-exception –