详解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 getopt模块处理命令行选项实例
May 13 Python
python使用append合并两个数组的方法
Apr 28 Python
python实现的简单FTP上传下载文件实例
Jun 30 Python
Python中Iterator迭代器的使用杂谈
Jun 20 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
Python利用Xpath选择器爬取京东网商品信息
Jun 01 Python
pytorch 查看cuda 版本方式
Jun 23 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 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中eval函数的危害与正确禁用方法
2014/06/30 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
python中偏函数partial用法实例分析
2015/07/08 Python
Python内置函数delattr的具体用法
2017/11/23 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
师德个人剖析材料
2014/02/02 职场文书
校园活动宣传方案
2014/03/28 职场文书
干部考核评语
2014/04/29 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
室外天线与收音机天线杆接合方法
2022/04/05 无线电