在Django中创建URLconf相关的通用视图的方法

作者:goldensun 时间:2021-09-17 06:07:58 

抽取出我们代码中共性的东西是一个很好的编程习惯。 比如,像以下的两个Python函数:


def say_hello(person_name):
 print 'Hello, %s' % person_name

def say_goodbye(person_name):
 print 'Goodbye, %s' % person_name

我们可以把问候语提取出来变成一个参数:


def greet(person_name, greeting):
 print '%s, %s' % (greeting, person_name)

通过使用额外的URLconf参数,你可以把同样的思想应用到Django的视图中。

了解这个以后,你可以开始创作高抽象的视图。 更具体地说,比如这个视图显示一系列的 Event 对象,那个视图显示一系列的 BlogEntry 对象,并意识到它们都是一个用来显示一系列对象的视图的特例,而对象的类型其实就是一个变量。

以这段代码作为例子:


# 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})

就这样小小的改动,我们突然发现我们有了一个可复用的,模型无关的视图! 从现在开始,当我们需要一个视图来显示一系列的对象时,我们可以简简单单的重用这一个 object_list 视图,而无须另外写视图代码了。 以下是我们做过的事情:

    我们通过 model 参数直接传递了模型类。 额外URLconf参数的字典是可以传递任何类型的对象,而不仅仅只是字符串。

    这一行: model.objects.all() 是 鸭子界定 (原文:

    我们使用 model.__name__.lower() 来决定模板的名字。 每个Python的类都有一个 __name__ 属性返回类名。 这特性在当我们直到运行时刻才知道对象类型的这种情况下很有用。 比如, BlogEntry 类的 __name__ 就是字符串 'BlogEntry' 。

    这个例子与前面的例子稍有不同,我们传递了一个通用的变量名给模板。 当然我们可以轻易的把这个变量名改成 blogentry_list 或者 event_list ,不过我们打算把这当作练习留给读者。

因为数据库驱动的网站都有一些通用的模式,Django提供了一个通用视图的集合,使用它可以节省你的时间。 我们将会在下一章讲讲Django的内置通用视图。
提供视图配置选项

如果你发布一个Django的应用,你的用户可能会希望配置上能有些自由度。 这种情况下,为你认为用户可能希望改变的配置选项添加一些钩子到你的视图中会是一个很好的主意。 你可以用额外URLconf参数实现。

一个应用中比较常见的可供配置代码是模板名字:


def my_view(request, template_name):
 var = do_something()
 return render_to_response(template_name, {'var': var})

了解捕捉值和额外参数之间的优先级 额外的选项

当冲突出现的时候,额外URLconf参数优先于捕捉值。 也就是说,如果URLconf捕捉到的一个命名组变量和一个额外URLconf参数包含的变量同名时,额外URLconf参数的值会被使用。

例如,下面这个URLconf:


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

urlpatterns = patterns('',
 (r'^mydata/(?P<id>\d+)/$', views.my_view, {'id': 3}),
)

这里,正则表达式和额外字典都包含了一个 id 。硬编码的(额外字典的) id 将优先使用。 就是说任何请求(比如, /mydata/2/ 或者 /mydata/432432/ )都会作 id 设置为 3 对待,不管URL里面能捕捉到什么样的值。

聪明的读者会发现在这种情况下,在正则表达式里面写上捕捉是浪费时间的,因为 id 的值总是会被字典中的值覆盖。 没错,我们说这个的目的只是为了让你不要犯这样的错误。

标签:Django,URLconf
0
投稿

猜你喜欢

  • Mysql 5.7.19 免安装版遇到的坑(收藏)

    2024-01-19 12:18:39
  • Python抛出引发异常(raise)知识点总结

    2023-09-12 06:56:01
  • asp实现通过session来统计在线人数的方法

    2007-08-13 12:56:00
  • python配置虚拟环境步骤

    2023-10-22 09:34:51
  • Python2.x版本中cmp()方法的使用教程

    2022-08-19 01:23:40
  • Python 2种方法求某个范围内的所有素数(质数)

    2022-09-07 08:43:40
  • 基于Python实现图片九宫格切图程序

    2023-11-01 21:16:38
  • JavaScript ES6语法中let,const ,var 的区别

    2024-05-09 15:06:49
  • python2.7安装opencv-python很慢且总是失败问题

    2021-01-10 06:11:15
  • C#中使用SendMessage

    2023-07-14 19:12:37
  • Python 树表查找(二叉排序树、平衡二叉树)

    2021-01-27 03:06:20
  • Thinkphp5文件包含漏洞解析

    2023-07-01 19:42:51
  • PHP+Ajax简单get验证操作示例

    2024-05-13 09:24:27
  • 详解使用pymysql在python中对mysql的增删改查操作(综合)

    2024-01-14 00:17:13
  • python读取有密码的zip压缩文件实例

    2021-03-31 20:58:53
  • IIRF(Ionic's Isapi Rewrite Filt er)入门,在IIS上重写Url

    2007-09-23 12:16:00
  • Python针对给定列表中元素进行翻转操作的方法分析

    2022-04-19 18:37:07
  • TorchVision Transforms API目标检测实例语义分割视频类

    2022-12-05 14:24:56
  • SQL Server 在分页获取数据的同时获取到总记录数

    2024-01-24 09:04:13
  • antd form表单使用setFildesValue 赋值失效的解决

    2024-04-10 13:50:19
  • asp之家 网络编程 m.aspxhome.com