私はこのような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-list
とtitle
は同じものに一致します。
filtered-list
のtag
に一致するものの利用可能なリストがある場合、list_titles
を起動させたいです。しかし、一致するtag
がない場合は、それをURLプロセッサにバブルバックして、show_title
が起動するようにします。
一致するタイトルがない場合は、そこで適切な404を発生させます。
ビューの内側からこれを実行できることはわかっていますが、プロセスをビューにハードワイヤードする必要があるのは少し臭いです。何が最初に選択され、何に渡されるかをURLの順序で決定したいと思います。
これは確かにビューロジックです。すべての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
または 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),
}