详解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 相关文章推荐
Windows8下安装Python的BeautifulSoup
Jan 22 Python
对Python新手编程过程中如何规避一些常见问题的建议
Apr 01 Python
详解使用Python处理文件目录的相关方法
Oct 16 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
python Kmeans算法原理深入解析
Aug 23 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
PyCharm 2020.2 安装详细教程
Sep 25 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
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
javascript 获取元素样式必杀技
2014/05/04 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
js实现二级导航功能
2017/03/03 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
js实现微信聊天效果
2020/08/09 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Python解惑之整数比较详解
2017/04/24 Python
回调函数的意义以及python实现实例
2017/06/20 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
Python中一行和多行import模块问题
2018/04/01 Python
python字符串与url编码的转换实例
2018/05/10 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python编程中类与类的关系详解
2019/08/08 Python
Python 转换文本编码实现解析
2019/08/27 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
RealTek面试题
2016/06/28 面试题
nginx搭建NFS网络文件系统
2022/04/14 Servers
Python 图片添加美颜效果
2022/04/28 Python
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers
Java Redisson多策略注解限流
2022/09/23 Java/Android