您的位置:首页 > 编程语言 > Go语言

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

2016-05-10 09:55 691 查看

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>dd)/$', 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>dd)/$', 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时有用的才奏效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: