Django:URL-patternsの高級な使い方とURLの伝達パラメータ

36130 ワード

http://muilpin.blog.163.com/blog/#m=0&t=3&c=django
1、複数のビュー関数の簡潔な書き方:各ビューは一つのpatternsに対応し、patternsでビューの位置を指定します。
 
   

from django.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() urlpatterns = patterns('dapp1.views', #第一个参数指定视图所在的位置 (r'^hello/$','hello'), #引用视图中的hello函数,注意这里需要使用单引号 (r'^world/$','world'), (r'^$', 'home'), )

urlpatterns += patterns('contact.views', #第二个视图,urlpatterns是个元组,满足可加性 (r'^contact/$','contact'), )


2、传递额外参数到视图函数中(额外参数也称为关键字参数)
 
   
# urls.py
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
    (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}), #           
    (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}), #        
)
# views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel
def foobar_view(request, template_name):  #        
   m_list = MyModel.objects.filter(is_new=True)
   return render_to_response(template_name, {'m_list': m_list})
3、url経路で伝達パラメータに名前をつけ、対応するビュー関数でネーミングパラメータから彼の値を取得する(伝達パラメータは位置パラメータともいう)
 
   
/mydata/jan/01/
/mydata/jan/02/
/mydata/jan/03/
# ...
/mydata/dec/30/
/mydata/dec/31/
urls.py
urlpatterns = patterns('',
(r'^mydata/(?P\w{3})/(?P\d\d)/$', views.my_view), # ?
 
   
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
) views.py
def my_view(request, month, day):
# ....
また、urlの提示により、パラメータ値が与えられ、追加のパラメータとして転送されます。
 
   
urlpatterns = patterns('',
(r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}),#
(r'^mydata/(?P\w{3})/(?P\d\d)/$', views.my_view),
)
views.py
def my_view(request, month, day):
# ....
URLconfが捕捉したネーミンググループ変数と付加的なURLconfパラメータに含まれる変数が同名の場合、追加のURLconfパラメータの値が使用される。
 
   
urlpatterns = patterns('',
(r'^mydata/(?P\d+)/$', views.my_view, {'id': 3}),
)
4、画面にパラメータを送る必要があるが、実際にはパラメータの伝達がない場合、デフォルトビューを使用することができます。
 
   
# urls.py

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
(r'^blog/$', views.page), #URLconf
(r'^blog/page(?P\d+)/$', views.page),
)

# views.py

def page(request, num='1'):
# Output the appropriate page of blog entries, according to num.
# ...
ここでは、二つのURL表式は同じ図を指しています。 view.page ,しかし、最初の表現はパラメータを伝達しませんでした。最初のスタイルにマッチした場合、 page() 関数はパラメータを指定します。 num 標準値を使う 「1」 ,第二の表現がマッチした場合、 page() 関数は正規表現を用いて伝達されるnumの値を表します。(注:デフォルトのパラメータ値は文字列‘1’であり、整数`1`ではないことに気づきました。一致を保つために、‘num`の値はいつも文字列です。捕獲されたパラメータは、純粋なPython文字列として送信されます。
5、その他のurlsを含む
 
   
from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^weblog/', include('mysite.blog.urls')), # $ , urls patterns
(r'^photos/', include('mysite.photos.urls')),
(r'^about/$', 'mysite.views.about'),
)
一つの含まれるURLconfは、任意のparent URLconfsから捕獲されたパラメータを受信し、捕獲された。 username 変数は、含まれるURLconfに伝達され、さらにそのURLconfの中の 一つずつ 表示関数
 
   
urlpatterns = patterns('',
(r'^(?P\w+)/blog/', include('foo.urls.blog')),
)
また、追加のURLconfオプションを転送します。 include() , 辞書を通じて、普通のビューに追加のURLconfオプションを渡すことができます。このようにすると、URLconfが含まれます。 一つずつ 行はそれらの追加のパラメータを受け取ります。パラメータを取り込むときと同じです。
 
   
urlpatterns = patterns('',
(r'^blog/', include('inner'), {'blogid': 3}),
)
この技術は、付加的に与えられたオプションを受け入れる各URLconfに関与すると確信した場合にのみ有効である。