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.

Était-ce utile?

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),
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top