Django:URL-patterns的高级使用方式与URL传递参数

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'), )


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<month>\w{3})/(?P<day>\d\d)/$', views.my_view), #在正则表达式前加上?<name>命名参数
   
   
(?<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<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时有用的才奏效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值