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


Posted in Python onJuly 20, 2015

抽取出我们代码中共性的东西是一个很好的编程习惯。 比如,像以下的两个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 的值总是会被字典中的值覆盖。 没错,我们说这个的目的只是为了让你不要犯这样的错误。

Python 相关文章推荐
python使用Queue在多个子进程间交换数据的方法
Apr 18 Python
在Python的Django框架中更新数据库数据的方法
Jul 17 Python
Python中的集合类型知识讲解
Aug 19 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
python 多线程串行和并行的实例
Feb 22 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Python SSL证书验证问题解决方案
Jan 13 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
python操作链表的示例代码
Sep 27 Python
Django模型层实现多表关系创建和多表操作
Jul 21 Python
python通过socket查询whois的方法
Jul 18 #Python
Python字符串匹配算法KMP实例
Jul 18 #Python
Python通过正则表达式选取callback的方法
Jul 18 #Python
Django的URLconf中使用缺省视图参数的方法
Jul 18 #Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 #Python
在Django框架中伪造捕捉到的URLconf值的方法
Jul 18 #Python
Django中传递参数到URLconf的视图函数中的方法
Jul 18 #Python
You might like
zf框架的校验器InArray使用示例
2014/03/13 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
详解python进行mp3格式判断
2016/12/23 Python
Python实现完整的事务操作示例
2017/06/20 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
python实现电子产品商店
2019/02/26 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
python实现图像全景拼接
2020/03/27 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
python3让print输出不换行的方法
2020/08/24 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
高一数学教学反思
2014/02/07 职场文书
聘任书模板
2014/03/29 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
信息技术国培研修日志
2015/11/13 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang