Django Urls

出典: UeblogWiki

目次

Tips

URL逆引き機能

url関数, permalink, reverse, {% url %}を使うことにより、 urls.py,views.py, テンプレート内で重複をさけることができます。

urls.pyで使う正規表現のパターン

正規表現の例
url 対応する正規表現 views関数に渡される引数
/blog/entry/1/ ^blog/entry/(P?<id>\d+)/$ id = 1
/blog/slug/hoge/ ^blog/slug/(?P<slug>[-\w]+)/$ slug = hoge
/blog/2007/08/31/ ^blog/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$ year=2007, month=08, day=31
/blog/2007/jan/20/ ^blog/(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\d{2})/$ year=2007, month=jan, day=20

include

includeを使うことでurls.pyの定義を取り込めます。プロジェクト直下のurls.pyは、このincludeを使って各アプリのurls.pyを取り込むことが多いです。

各アプリのurls.pyはmanage.pyでアプリを作ったときに自動的に生成されないので、自分で作る必要があります。

% python manage.py startapp blog 

blog/__init__.py, blog/models.py, blog/views.py が生成されるが blog/urls.pyは生成されない

# myproject/urls.py
urlpatterns = patterns('',
    (r'^blog/', include('blog.urls')), #myproject/blog/urls.pyの定義を読み込む
)
# myproject/blog/urls.py を新規に作成
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^$', 'blog.views.index'), #http://www.yourdomain.com/blog/に対応
    (r'^archive/$', 'blog.views.archive'), #http://www.yourdomain.com/blog/archive/に対応
)

http://www.yourdomain.com/blog/まではmyproject/urls.pyで定義されているので、includeで呼び出すmyproject/bbs/urls.pyではその続きを定義すればよいのです。

参考