39

私はこのような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'),
)

filtered-listtitle同じものに一致します。

に一致するものの利用可能なリストがある場合tag、私は発砲しfiltered-listたいと思います。list_titlesしかし、一致するものがない場合はtag、それをURLプロセッサにバブルバックしたいので、show_title起動します。

一致するタイトルがない場合は、そこで適切な404を発生させます。

ビューの内側からこれを実行できることはわかっていますが、プロセスをビューに配線する必要があるのは少し臭いです。URLの順序で、最初に何が選択され、何に渡されるかを決定したいと思います。

4

1 に答える 1

56

これは確かにビューロジックです。すべてのurls.pyは、検証を実行するのではなく、URLパターンを照合するためのものです。Http404例外を使用してこれを処理できます。

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

get_object_or_404または、 orメソッドを見つけるとget_list_or_404、少し短くなります。


約束された編集は次のとおりです。正確にはあなたが探しているものではありませんが...

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),
}
于 2009-08-19T12:53:11.217 に答える