详解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中函数的参数
Apr 27 Python
Python松散正则表达式用法分析
Apr 29 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
Jun 14 Python
使用Python对Access读写操作
Mar 30 Python
python实现简易云音乐播放器
Jan 04 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
pycharm 安装JPype的教程
Aug 08 Python
Python基本语法之运算符功能与用法详解
Oct 22 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
Spring http服务远程调用实现过程解析
Jun 11 Python
python如何支持并发方法详解
Jul 25 Python
python使用pygame创建精灵Sprite
Apr 06 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
自定义session存储机制避免会话保持问题
2014/10/08 PHP
php中动态调用函数的方法
2015/03/16 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
JavaScript 指导方针
2007/04/05 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
js实现的倒计时按钮实例
2015/06/24 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python 类的特殊成员解析
2018/06/20 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
python SocketServer源码深入解读
2019/09/17 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
思想品德课教学反思
2014/02/10 职场文书
法语专业求职信
2014/07/20 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
python 提取html文本的方法
2021/05/20 Python