详解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获得图片base64编码示例
Jan 16 Python
python中self原理实例分析
Apr 30 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
Python发送form-data请求及拼接form-data内容的方法
Mar 05 Python
python实现员工管理系统
Jan 11 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
May 08 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
Python语法之精妙的十个知识点(装B语法)
Jan 18 Python
python如何进入交互模式
Jul 06 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 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中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
pytorch的batch normalize使用详解
2020/01/15 Python
Python如何定义接口和抽象类
2020/07/28 Python
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
车间副主任岗位职责
2013/12/24 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
新课程改革心得体会
2016/01/22 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
python中redis包操作数据库的教程
2022/04/19 Python
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技
nginx 配置缓存
2022/05/11 Servers