详解Django通用视图中的函数包装


Posted in Python onJuly 21, 2015

用函数包装来处理复杂的数据过滤

另一个常见的需求是按URL里的关键字来过滤数据对象。 之前,我们在URLconf中硬编码了出版商的名字,但是如果我们想用一个视图就显示某个任意指定的出版商的所有书籍,那该怎么办呢? 我们可以通过对 object_list 通用视图进行包装来避免 写一大堆的手工代码。 按惯例,我们先从写URL配置开始:

urlpatterns = patterns('',
 (r'^publishers/$', list_detail.object_list, publisher_info),
 **(r'^books/(\w+)/$', books_by_publisher),**
)

接下来,我们写 books_by_publisher 这个视图:

from django.shortcuts import get_object_or_404
from django.views.generic import list_detail
from mysite.books.models import Book, Publisher

def books_by_publisher(request, name):

 # Look up the publisher (and raise a 404 if it can't be found).
 publisher = get_object_or_404(Publisher, name__iexact=name)

 # Use the object_list view for the heavy lifting.
 return list_detail.object_list(
  request,
  queryset = Book.objects.filter(publisher=publisher),
  template_name = 'books/books_by_publisher.html',
  template_object_name = 'book',
  extra_context = {'publisher': publisher}
 )

这样写没问题,因为通用视图就是Python函数。 和其他的视图函数一样,通用视图也是接受一些 参数并返回 HttpResponse 对象。 因此,通过包装通用视图函数可以做更多的事。

注意

注意在前面这个例子中我们在 extra_context中传递了当前出版商这个参数。
处理额外工作

我们再来看看最后一个常用模式:

想象一下我们在 Author 对象里有一个 last_accessed 字段,我们用这个字段来记录最近一次对author的访问。 当然通用视图 object_detail 并不能处理这个问题,但是我们仍然可以很容易地编写一个自定义的视图来更新这个字段。

首先,我们需要在URL配置里设置指向到新的自定义视图:

from mysite.books.views import author_detail

urlpatterns = patterns('',
 # ...
 **(r'^authors/(?P<author_id>\d+)/$', author_detail),**
 # ...
)

接下来写包装函数:

import datetime
from django.shortcuts import get_object_or_404
from django.views.generic import list_detail
from mysite.books.models import Author

def author_detail(request, author_id):
 # Delegate to the generic view and get an HttpResponse.
 response = list_detail.object_detail(
  request,
  queryset = Author.objects.all(),
  object_id = author_id,
 )

 # Record the last accessed date. We do this *after* the call
 # to object_detail(), not before it, so that this won't be called
 # unless the Author actually exists. (If the author doesn't exist,
 # object_detail() will raise Http404, and we won't reach this point.)
 now = datetime.datetime.now()
 Author.objects.filter(id=author_id).update(last_accessed=now)

 return response

注意

除非你添加 last_accessed 字段到你的 Author 模型并创建 books/author_detail.html 模板,否则这段代码不能真正工作。

我们可以用同样的方法修改通用视图的返回值。 如果我们想要提供一个供下载用的 纯文本版本的author列表,我们可以用下面这个视图:

def author_list_plaintext(request):
 response = list_detail.object_list(
  request,
  queryset = Author.objects.all(),
  mimetype = 'text/plain',
  template_name = 'books/author_list.txt'
 )
 response["Content-Disposition"] = "attachment; filename=authors.txt"
 return response

这个方法之所以工作是因为通用视图返回的 HttpResponse 对象可以象一个字典 一样的设置HTTP的头部。 随便说一下,这个 Content-Disposition 的含义是 告诉浏览器下载并保存这个页面,而不是在浏览器中显示它。

Python 相关文章推荐
Python set集合类型操作总结
Nov 07 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
python实现决策树分类
Aug 30 Python
Python实现登陆文件验证方法
Oct 06 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
Python threading.local代码实例及原理解析
Mar 16 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
Jan 29 Python
在Python的Django框架中显示对象子集的方法
Jul 21 #Python
在Django的通用视图中处理Context的方法
Jul 21 #Python
Django框架中的对象列表视图使用示例
Jul 21 #Python
在Python的Django框架中使用通用视图的方法
Jul 21 #Python
在Django的模型中执行原始SQL查询的方法
Jul 21 #Python
在Django的模型中添加自定义方法的示例
Jul 21 #Python
详解Python的Django框架中Manager方法的使用
Jul 21 #Python
You might like
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
PHP 图像尺寸调整代码
2010/05/26 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
python实现批量转换图片为黑白
2020/06/16 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
客服部工作职责范本
2014/02/14 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
上诉答辩状范文
2015/05/22 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
Python异常类型以及处理方法汇总
2021/06/05 Python
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫