Pergunta

Eu tenho um padrão de URLs 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'),
)

o filtered-list e title Combine as mesmas coisas.

Se houver uma lista disponível de coisas que correspondam ao tag dentro filtered-list, Eu quero list_titles para disparar. Mas se não houver uma correspondência tag, Eu quero borbulhar isso de volta ao processador URL, então show_title dispara.

Se não houver título correspondente, eu levantarei um 404 adequado lá.

Eu sei que posso fazer isso de dentro da vista ... mas é um pouco fedorento ter que enrugar o processo na vista. Gostaria que o URL fosse decidido o que é escolhido primeiro e o que ele entrega.

Foi útil?

Solução

Esta é certamente a lógica de visualização; Todos os URLs.py são para os padrões de URL correspondentes, não realizando validação. Você pode usar o Http404 exceção para lidar com isso.

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})

Como alternativa, você pode encontrar o get_object_or_404 ou get_list_or_404 Métodos, que diminuem um pouco.


A edição prometida segue. Não é exatamente o que você está procurando, mas ...

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top