Django 高级视图和url配置

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 ,不过我们打算把这当作练习留给读者。

posted @ 2019-05-06 10:53  南邮吴亦凡  阅读(199)  评论(0编辑  收藏  举报