详解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同时兼容python2和python3的8个技巧分享
Jul 11 Python
Python脚本实现下载合并SAE日志
Feb 10 Python
python实现模拟按键,自动翻页看u17漫画
Mar 17 Python
详解Python中find()方法的使用
May 18 Python
python从入门到精通(DAY 1)
Dec 20 Python
pandas string转dataframe的方法
Apr 11 Python
python使用turtle库绘制树
Jun 25 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
python爬虫筛选工作实例讲解
Nov 23 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
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
js常见表单应用技巧
2008/01/09 Javascript
Javascript学习笔记2 函数
2010/01/11 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
在node中如何使用 ES6
2017/04/22 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
python运行时间的几种方法
2016/06/17 Python
Python实现Kmeans聚类算法
2020/06/10 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python查看模块安装位置的方法
2018/10/16 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
体育教育个人自荐信范文
2013/12/01 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
关于幸福的感言
2015/08/03 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
入党转正申请书范文
2019/05/20 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL