详解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 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
python删除字符串中指定字符的方法
Aug 13 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 Python
set在python里的含义和用法
Jun 24 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
使用python求解二次规划的问题
Feb 29 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
如何基于Django实现上下文章跳转
Sep 16 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 Python
Python极值整数的边界探讨分析
Sep 15 Python
Python 数据可视化之Seaborn详解
Nov 02 Python
python_tkinter事件类型详情
Mar 20 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 ajax 静态分页过程形式
2011/09/02 PHP
php 中英文语言转换类
2011/09/07 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
python getopt模块使用实例解析
2019/12/18 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Python网页解析器使用实例详解
2020/05/30 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
美国社交购物市场:MassGenie
2019/02/18 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
大学生应聘自荐信
2013/10/11 职场文书
写自荐信要注意什么
2013/12/26 职场文书
大学生求职计划书
2014/04/30 职场文书
党员转正党支部意见
2015/06/02 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android