http://muilpin.blog.163.com/blog/#m=0&t=3&c=django
1、多个视图函数在patterns中的简洁写法:每一个视图对应一个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'), )
3、在url路径中给传递参数命名,在对应的视图函数中根据命名参数获取他的值(传递参数也称为位置参数)# 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})
/mydata/jan/01/
urls.py
/mydata/jan/02/
/mydata/jan/03/
# ...
/mydata/dec/30/
/mydata/dec/31/urlpatterns = patterns('',
(r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$', views.my_view), #在正则表达式前加上?<name>命名参数
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) |
def my_view(request, month, day):
# ....
另外,根据url的提示,给定参数值,作为额外参数进行传递额
urlpatterns = patterns('',
(r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}),#
(r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$', views.my_view),
)
views.py
def my_view(request, month, day):
# ....
如果URLconf捕捉到的一个命名组变量和一个额外URLconf参数包含的变量同名时,额外URLconf参数的值会被使用。
urlpatterns = patterns('',
(r'^mydata/(?P<id>\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<num>\d+)/$', views.page),
)
# views.py
def page(request, num='1'):
# Output the appropriate page of blog entries, according to num.
# ...
在这里,两个URL表达式都指向了同一个视图 views.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<username>\w+)/blog/', include('foo.urls.blog')),
)
另外,传递额外的URLconf选项到 include() , 就像你可以通过字典传递额外的URLconf选项到普通的视图。 当你这样做的时候,被包含URLconf的 每一 行都会收到那些额外的参数。与捕获参数时等价的
urlpatterns = patterns('',
(r'^blog/', include('inner'), {'blogid': 3}),
)
这种技术仅当你确信在涉及到的接受到额外你给出的选项的每个URLconf时有用的才奏效。