URLConf Tip 01 - キャプチャの有無にかかわらず同一のviewで処理する

Djangoで作成したサイトのURLを設定するのはurls.pyに記述します。

普段使っている例を見てみましょう。

urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^$', 'appname.views.index'),
    (r'blog/', include('blog.urls')),
    (r'photo/$', 'photo.views.index'),
    (r'photo/(?P<id>\d+)/$', 'photo.views.index'),
)

が、しかし少し変なところに気がつきませんか?

(r'photo/$', 'photo.views.index'),
(r'photo/(?P<id>\d+)/$', 'photo.views.index'),

のところです。
違う処理を定義しているはずなのに同一のviewを指定しています。
これでは正しくサイトを運用することが出来ません。
もうひとつのviewを作成して対応したいが、事情でひとつのviewで処理を行わなければならない。
そのような時、正規表現の前方一致検索を加えることによって実現できます。

(r'photo/(?:(?P<id>\d+)/)?$', 'photo.views.index'),

これにより、/photo/でアクセスしても/photo/3/でアクセスしても同一のviewで処理することが可能になります。

twitter 2010-03-08 20:58:34.144552

Recent Updates

URLConf Tip 01 - キャプチャの有無にかかわらず同一のviewで処理する
Markdownの入力補助"wmd"をAdmin siteで使う
ModelFormでfieldのwidgetを変更する
動的なformを作る 6 - Dynamic Inline Admin site編
Formsetsを使う3 - inlineformset_factory編
動的なformを作る 5 - django-dynamic-formset編
Formクラスからメディアを定義する
複数のmodelを結合する 2 - Proxy model編
複数のmodelを結合する 1
ModelFormでfieldの表示順番を変える
Admin siteのwidgetを個別に変更する
formfield_overridesを使ってAdmin siteのwidgetを変更する
Admin siteのlist_displayをカスタマイズする - リンク編
Admin siteのlist_displayをカスタマイズする - 基本編
Admin siteのTextareaの高さを自在に変更する - admin.py編