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.

È stato utile?

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),
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top