关于django url配置

1:匹配/分组算法

传递额外的参数到视图函数中
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})

这里直接把template_name作为额外参数传到视图

当url里有额外参数跟捕捉值,django总是优先用url的额外参数
r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}),

2:创建一个通用视图
# urls.py

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

urlpatterns = patterns('',
(r'^events/$', views.event_list),
(r'^blog/entries/$', views.entry_list),
)

# views.py

from django.shortcuts import render_to_response
from mysite.models import Event, BlogEntry

def event_list(request):
obj_list = Event.objects.all()
return render_to_response('mysite/event_list.html', {'event_list': obj_list})

def entry_list(request):
obj_list = BlogEntry.objects.all()
return render_to_response('mysite/blogentry_list.html', {'entry_list': obj_list})

这两个视图做的事情实质上是一样的:显示一系列的对象。让我们把它们显示的对象的类型抽象出来:
# urls.py

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

urlpatterns = patterns('',
(r'^events/$', views.object_list, {'model': models.Event}),
(r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),
)

# views.py

from django.shortcuts import render_to_response

def object_list(request, model):
obj_list = model.objects.all()
template_name = 'mysite/%s_list.html' % model.__name__.lower()
return render_to_response(template_name, {'object_list': obj_list})

我们通过 model 参数直接传递了模型类

使用 model.__name__.lower() 来决定模板的名字

3:使用缺省视图参数
当传递的参数缺省的时候在视图的方法中可以用
def page(request, num="1"):

4:从URL中捕获文本

参数 是作为字符串传至 views的,而不是整型

5:决定URLconf搜索的东西
当一个请求进来时,Django试着将请求的URL作为一个普通Python字符串进行URLconf模式匹配(而不是作为一个Unicode字符串)。这并不包括 GET 或 POST 参数或域名。它也不包括第一个斜杠,因为每个URL必定有一个斜杠。
在解析URLconf时,请求方法(例如, POST , GET , HEAD )并 不会 被考虑。换而言之,对于相同的URL的所有请求方法将被导向到相同的函数中。因此根据请求方法来处理分支是视图函数的责任。
所以www.sohu.com/view/ 跟www.sohu.com/view/?some=1 请求的是同一个视图


6:::包含其他URLconf

如果你的Django项目有多个app的时候就可以用包含(include)来配置你的url
urlpatterns = patterns('',
(r'^weblog/', include('mysite.blog.urls')),
(r'^photos/', include('mysite.photos.urls')),
(r'^about/$', 'mysite.views.about'),
)
注意::::指向 include() 的正则表达式并 不 包含一个 $ (字符串结尾匹配符)但是包含了一个斜杆
每当Django遇到 include() 时,它将截断匹配的URL,并把剩余的字符串发往包含的URLconf作进一步处理

一:捕获的参数如何和include()协同工作
urlpatterns = patterns('',
(r'^(?P\w+)/blog/', include('foo.urls.blog')),
)
一个被包含的URLconf接收任何来自parent URLconfs的被捕获的参数
被捕获的username变量将传递给被包含的 URLconf,进而传递给那个URLconf中的 每一个 视图函数

二: 额外的URLconf如何和include()协同工作
相似的,你可以传递额外的URLconf选项到 include() , 就像你可以通过字典传递额外的URLconf选项到普通的视图。当你这样做的时候,被包含URLconf的 每一 行都会收到那些额外的参数

你可能感兴趣的:(python)