详解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 根据pid杀死相应进程的方法
Jan 16 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
python3 kmp 字符串匹配的方法
Jul 07 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
使用python绘制cdf的多种实现方法
Feb 25 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
Python 字符串池化的前提
Jul 03 Python
基于Python实现nc批量转tif格式
Aug 14 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
模拟xcopy的函数
2006/10/09 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
php无限级分类实现方法分析
2016/10/19 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
简单谈谈Python中的json与pickle
2017/07/19 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
python中map的基本用法示例
2018/09/10 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
艺术用品:Arteza
2018/11/25 全球购物
学生会部长竞聘书
2014/03/31 职场文书
师德模范事迹材料
2014/06/03 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
新员工入职欢迎词
2015/01/23 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
2015年社区重阳节活动总结
2015/07/30 职场文书
小学感恩主题班会
2015/08/12 职场文书
学习经验交流会总结
2015/11/02 职场文书
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle