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.

¿Fue útil?

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),
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top