URL配置技巧:
方法一:
1 from django.conf.urls.defaults import *
2 from mysite.views import current_datetime, hours_ahead, hours_behind, now_in_chicago, now_in_london
3
4 urlpatterns = patterns('',
5 ('time/', current_datetime),
6 ('time/plus/(d{1,2})/', hours_ahead),
7 ('time/minus/(d{1,2})/', hours_behind),
8 ('time/in_chicago/', now_in_chicago),
9 ('time/in_london/', now_in_london),
10 )
方法二:
1 from django.conf.urls.defaults import *
2 from mysite import views
3
4 urlpatterns = patterns('',
5 ('time/', views.current_datetime),
6 ('time/plus/(d{1,2})/', views.hours_ahead),
7 ('time/minus/(d{1,2})/', views.hours_behind),
8 ('time/in_chicago/', views.now_in_chicago),
9 ('time/in_london/', views.now_in_london),
10 )
方法三:
from django.conf.urls.defaults import *
urlpatterns = patterns('website.views',
('time/', 'website.views.current_datetime'),
('time/plus/(d{1,2})/', 'website.views.hours_ahead'),
('time/minus/(d{1,2})/', 'website.views.hours_behind'),
('time/in_chicago/', 'website.views.now_in_chicago'),
('time/in_london/', 'website.views.now_in_london'),
)
方法一的url配置和方法二和方法三的url配置结果是一样的,上面的配置的缺点是如果是导入多个函数,就要在代码前面一直导入,比较繁琐,
下面的采用的是字符串技术,只要在url配置里面加一个参数,这样就不需要在前面导入,还有一点注意此处参数两边引号,这边django会自动处理字符串
使用多个视图前缀:
在实践中,如果你使用字符串技术,特别是当你的 URLconf 中没有一个公共前缀时,你最终可能混合视图。然而,你仍然可以利用视图前缀的简便方式来减少重复。只要增加多个 patterns() 对象,象这样:(下面两边部分的代码均是基于Django1.1)
旧的:
1 from django.conf.urls.defaults import *
2
3 urlpatterns = patterns('',
4 (r'^/?$', 'mysite.views.archive_index'),
5 (r'^(d{4})/([a-z]{3})/$', 'mysite.views.archive_month'),
6 (r'^tag/(w+)/$', 'weblog.views.tag'),
7 )
新的:
1 from django.conf.urls.defaults import *
2
3 urlpatterns = patterns('mysite.views',
4 (r'^/?$', 'archive_index'),
5 (r'^(d{4})/([a-z]{3})/$', 'archive_month'),
6 )
7
8 urlpatterns += patterns('weblog.views',
9 (r'^tag/(w+)/$', 'tag'),
10 )
整个框架关注的是存在一个名为 urlpatterns 的模块级别的变量。这个变量可以动态构建,正如本例中我们所做的一样。
创建一个通用视图:
1 # urls.py
2
3 from django.conf.urls.defaults import *
4 from mysite import views
5
6 urlpatterns = patterns('',
7 (r'^events/$', views.event_list),
8 (r'^blog/entries/$', views.entry_list),
9 )
10
11 # views.py
12
13 from django.shortcuts import render_to_response
14 from mysite.models import Event, BlogEntry
15
16 def event_list(request):
17 obj_list = Event.objects.all()
18 return render_to_response('mysite/event_list.html', {'event_list': obj_list})
19
20 def entry_list(request):
21 obj_list = BlogEntry.objects.all()
22 return render_to_response('mysite/blogentry_list.html', {'entry_list': obj_list})
这两个视图做的事情实质上是一样的:显示一系列的对象。让我们把它们显示的对象的类型抽象出来:
1 # urls.py
2
3 from django.conf.urls.defaults import *
4 from mysite import models, views
5
6 urlpatterns = patterns('',
7 (r'^events/$', views.object_list, {'model': models.Event}),
8 (r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),
9 )
10
11 # views.py
12
13 from django.shortcuts import render_to_response
14
15 def object_list(request, model):
16 obj_list = model.objects.all()
17 template_name = 'mysite/%s_list.html' % model.__name__.lower()
18 return render_to_response(template_name, {'object_list': obj_list})
-
我们通过 model 参数直接传递了模型类。额外URLconf参数的字典是可以传递任何类型的对象,而不仅仅只是字符串。
-
这一行: model.objects.all() 是 鸭子界定 (原文:duck typing,是计算机科学中一种动态类型判断的概念)的一个例子:如果一只鸟走起来像鸭子,叫起来像鸭子,那我们就可以把它当作是鸭子了。需要注意的是代码并不知道 model 对象的类型是什么;它只要求 model 有一个 objects 属性,而这个属性有一个 all() 方法
-
我们使用 model.__name__.lower() 来决定模板的名字。每个Python的类都有一个 __name__ 属性返回类名。这特性在当我们直到运行时刻才知道对象类型的这种情况下很有用。比如, BlogEntry 类的 __name__ 就是字符串 'BlogEntry' 。
-
这个例子与前面的例子稍有不同,我们传递了一个通用的变量名给模板。当然我们可以轻易的把这个变量名改成 blogentry_list 或者 event_list ,不过我们打算把这当作练习留给读者。