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

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时有用的才奏效。

你可能感兴趣的:(Django:URL-patterns的高级使用方式与URL传递参数)