深入Django(1): 通用视图 (generic views)

如果对Django的基础部分尚不熟悉,请参考《Django实战》系列。

内容提要
1. 回顾Django的视图函数(view function)
2. 在视图函数中使用模板
3. 简化视图函数的两个工具
4. 使用通用视图函数
5. Django提供的通用视图

1. 回顾Django的视图函数(view function)

Django中将视图定义为一种函数,我们称其为视图函数(view function)。当Django框架接收到http请求的时候,从定义的urlpatterns中寻找url表达式进行匹配,一旦找到匹配的项,就将HTTPRequest以及匹配到的其他字符串作为参数,调用找到的视图函数,然后根据视图函数返回的HTTPResponse对象进行响应。所以视图函数应该至少接收一个django.http.HTTPRequest对象作为参数,并返回django.http.HTTPResponse对象,如下:

def my_view(request, *args, **kwargs): response = HTTPResponse() … ... return response

 

2. 在视图函数中使用模板

视图函数返回的response对象中包含一些头(Header)信息和内容(Content),而我们通常通过模板来生成内容,所以我们经常用到的视图函数应该是这样:

 

def my_view_with_template(request, *args, **kwargs): var1 = foo var2 = bar t = get_template('path_name_of_template_file') c = Context({'key1':var1,'key2':var2}) content = t.render( c) return HTTPResponse(content)

 

3. 简化视图函数的两个工具

总是写这样的代码实在是让人厌倦,所以Django为我们提供了两个有用的工具:
一个是django.shortcuts.render_to_response函数,接收一系列的参数,包括模板路径、context使用的字典、原始的context实例以及要设定的mimetype等:
     render_to_response(template_path_name, dictionary=None, context_instance=None, mimetype=None)
另一个是locals()函数,将所有的局部变量组装成一个字典。
有了这两个工具,视图函数就可以这样写:

def my_view_with_template(request, *args, **kwargs): var1 = foo var2 = bar return render_to_response('path_name_of_template_file', locals())

 

4. 使用通用视图函数

有了这两个工具,编写视图函数确实可以简化很多。但是这样你就满意了吗?Django并没有就此止步,更进一步注意到,很多视图函数其实都在做同样的事情,比如显示一组模型对象的列表,显示模型对象的详细信息,对模型对象的增、删、改操作等。为了简化对这些情况的处理,Django定义了一系列的通用视图(generic views),我们只需要使用这些内置的通用视图函数,而无需自己编写就可以实现相应的功能。

使用通用视图的方法是在URLconf文件中创建参数字典,将字典作为URLconf元组的第三个成员,即可自动在调用视图函数时向其传递参数了。比如在django.views.generic.list_detail模块中的object_list函数,用于显示模型对象的列表,可以接受queryset参数作为模型对象的结果集。如果我们要用该视图函数显示在《Django实战》系列中的创建的第一个模型类Product的列表,可以在URLconf中这样配置:

from django.conf.urls.defaults import * from django.views.generic import list_detail from depot.depotapp.models import Product product_info = { 'queryset': Product.objects.all(), } urlpatterns = patterns('', (r'^product/list/$', list_detail.object_list, product_info) )

 

除了queryset外,object_list函数还可以接收许多其他的参数:

 

object_list(request, queryset, paginate_by=None, page=None, allow_empty=True, template_name=None, template_loader=loader, extra_context=None, context_processors=None, template_object_name='object', mimetype=None )

 

通用视图函数接收到参数后,会创建context,并渲染模板,最后返回HTTPResponse对象。object_list函数创建的context中会包含以下字典项:

  object_list             要显示的对象的list
  is_paginated         是否分页
  results_per_page 如果分页,存储每页记录数
  has_next              是否有下一页
  has_previous       是否有上一页
  page                     当前页码
  next                      下一页
  previous               上一页
  pages                   总页数
  hits                       总条目数
  last_on_page       本页最后录一条记录的序数(从1开始)
  first_on_page       本页第一条记录的序数(从1开始)
  page_range          页码范围的列表

如果这些context字典项不能满足你的需要,还可以通过指定extra_context参数,传入一个字典,该字典中的内容会被合并到context字典中。

context字典项会被模板使用。如果不指定模板,该函数将使用[app_name]/[model_name]_list.html作为模板,指定模板的方法也是通过参数字典,比如:

product_info = { 'queryset': Product.objects.all(), 'template_name': 'depotapp/another_product_list.html'),  }

这个参数字典会传入template_name参数来指定渲染的模板文件。

5. Django提供的通用视图

除了object_list外,Django还提供了许多通用视图函数,分布在几个模块中:

django.views.generic.list_detail模块

  • object_list      显示模型对象列表   
  • object_detail  显示单个模型对象

django.views.generic.create_update模块

  • create_object    创建模型对象
  • update_object   修改模型对象
  • delete_object    删除模型对象

django.views.generic.simple模块

  • direct_to_template   直接使用指定的模板渲染给定的context对象
  • redirect_to   重定向到指定的url

django.views.generic.date_based模块

这个模块主要处理“按时间查看存档”的功能,来源于新闻出版行业。具体包括:

  • archive_index   最顶级的归档,列出所有年份及指定数量的最新对象
  • archive_year     按年归档,列出所有拥有对象的月份
  • archive_month   按月归档,列出本月的所有对象,找到拥有对象的上一个、下一个月份
  • archive_week     按周归档,列出本周的所有对象
  • archive_day     按日归档,列出当天的所有对象,找到拥有对象的上一个、下一个日期
  • archive_today     当前日期(今天)的按日归档
  • object_detail     显示按照年/月/日/序号找到的对象

这些通用视图函数不再一一介绍,可以参考Django API文档,关注其参数,context内容和默认模板,就能基本掌握其使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统字体的Regular、Light等几种名称的区别

以苹果系统中的PingFang SC系列字体为例,其中常见的有下面几种类型可以细分如下。 PingFang SC ExtraLight 苹方 特细 PingFang SC Light 苹方 细体 PingFang SC Regular 苹方 常规 PingFang SC Medium 苹方 中等 Pi…

J2EE WEBWORK FRAMEWORK安全隐患

TEAM : I.S.T.OAUTHOR : KJ021320转载需注明作者,未经作者同意,不得用于任何形式的商业活动 WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。框架本身就是抽象空实现的!一般很少会给程序带来0day漏洞,但是因为W…

使用 servlet 连接数据库

1.项目工程 web.xml 配置 1 <servlet> 2 <description>This is the description of my J2EE component</description> 3 <display-name>This is the display name of my J2EE component</display-name> 4 <servlet-name>DBSer…

我用涂鸦模块做的报警系统

在上次发的涂鸦的文章之后涂鸦的这套宠物SDK设计&#xff0c;真香最近刚好有一个朋友需要做一个DEMO&#xff0c;这个DEMO是和图像识别相关的&#xff0c;我这个朋友在一个烟火报警的设备&#xff0c;大家都知道我们住的小区里面都会有一个监控系统吧&#xff0c;监控系统里面是…

Lnmp环境安装禅道项目管理软件

1、本地环境 CentOS Linux release 7.5.1804 (Core) PHP 7.1.0-dev (cli) mysql Ver 14.14 Distrib 5.7.22 nginx version: nginx/1.11.1 2、下载禅道开源版安装包并安装 神道官网地址&#xff1a;https://www.zentao.net/开源代码下载地址&#xff1a;https://www.zentao.net…

二叉树的非递归操作

这里涉及到二叉树的非递归操作有&#xff1a;先序遍历、中序遍历、后序遍历数据结构树结点&#xff1a;structNode { chardata; Node *left; Node *right; };标志&#xff1a;enumTag{goLeft, goRight, goBack };goLeft指示访问左子树goLeft指示访问右子树&#xf…

UDT源码剖析(二):UDT自带例程recvfile注释

这几天学习了UDT自带的例子&#xff0c;结合源码进行了测试如下&#xff1a; #ifndef WIN32 #include <arpa/inet.h>#include <netdb.h>#else#include <winsock2.h>#include <ws2tcpip.h>#endif#include <fstream>#include <iostream>#…

建立公司

最近标哥说有创业的想法&#xff0c;然后我帮忙搜了下关于创办公司的一些文章&#xff0c;晓宇的这篇文章把创业的过程写了个大概&#xff0c;也分享给大家&#xff0c;如果有创业想法的&#xff0c;按照这样的思路去寻找自己的合伙人。 自从17年4月份开始辞职创业&#xff0c;…

想在创建虚拟机的时候指定ip调研

想调研一下libvit xml能否提供类似的配置选项&#xff1a; xml应该写成这个样子&#xff0c;预先要在宿主机上面创建br0&#xff0c;配置要分配指定ip Using an existing host bridge Since 0.9.4 This shows how to use a pre-existing host bridge "br0". The gues…

UDT源码剖析(三):UDT::startup()过程代码注释

调用路线 UDT::startup()->CUDT::startup()->CUDTUnited::startup() 1 int startup() 2 { 3 return CUDT::startup(); 4 } 1 int CUDT::startup() 2 { 3 return s_UDTUnited.startup(); 4 } 查看源代码 打印帮助1 int CUDTUnited::startup() 2 { 3 // 开启一个…

第五节 CImage和CBmp(二)

由于这个库主要用于VC MFC下开发应用&#xff0c;因此目前可以下载到版本只支持MFC开发。如果您需要标准Win32的库&#xff0c;可以在回复时留下您的邮箱&#xff0c;或跟我联系。Email&#xff1a;wuchunlei163.comQQ&#xff1a;819543772EasyAnalysis图像分析库测试版以及源…

Linux 新系统易用性向 Windows 看齐

大家好&#xff0c;今天是一年一度的高考&#xff0c;不知道各位在多年以前有没有后悔选择电子专业&#xff0c;如果再给你一次机会&#xff0c;你会选择其他专业吗&#xff1f;以下是内容正文&#xff0c;由黄工整理&#xff01;来源 | 网络嵌入式开发&#xff0c;很多工程师都…

深度剖析SOC高性能实时事件关联分析引擎

【引言】安全管理平台&#xff08;SOC&#xff09; 的一项关键技术就是事件关联分析。借助实时的事件关联分析引擎&#xff0c;安全管理平台能够发掘出复杂的海量安全日志和事件背后隐藏的信息&#xff0c;引导安全管理人员发现外 部***和内部违规行为。作为本系列的第五篇文章…

P3165 [CQOI2014]排序机械臂

传送门 就是说要维护一个数据结构资瓷区间反转和查询第\(K\)大&#xff0c;那么splay吧 我们可以把原数组按高度为第一关键字&#xff0c;下标为第二关键字排序&#xff0c;然后直接建出splay 这样的话每次第\(K\)大直接查询编号然后把它转到根节点&#xff0c;那么左子树大小1…

靠,嘉立创打板又降价

说个题外话&#xff0c;我前段时间和同事聊天&#xff0c;我同事是一个项目经理&#xff0c;我跟他说我有朋友在嘉立创&#xff0c;然后随口说了句&#xff0c;我们这个行业应该没有不知道嘉立创的吧&#xff0c;我同事回了一句&#xff0c;什么是嘉立创&#xff0c;然后我愣了…

动态提示的下拉框

<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312"> <META content"fason,阿信" nameAuthor> <title>动态提示的下拉框</title> <style> a{color:red;text-decoratio…

深度解析Cocoa异步请求和libxml2.dylib教程(1)

深度解析Cocoa异步请求和libxml2.dylib教程是本文要介绍的内容&#xff0c;不多说&#xff0c;直接进入话题&#xff0c;很早就在cocoachina上看到这个框架了,今天终于有机会来使用这个东东了. 我这里写一下,如何往iphone项目中添加这个框架. 步骤如下: 1.下载该framework : ht…

UDT源码剖析(四):UDT的GC线程相关过程代码注释

着UDT::Startup()的启动&#xff0c;GC线程也随之运行了。 GC主要关注的就是UDTSocket的释放&#xff0c;下面我们来看看这个GC线程是怎么实现的。 查看源代码 打印帮助1 #ifndef WIN32 2 void* CUDTUnited::garbageCollect(void* p) 3 #else 4 DWORD WINAPI CUDTUnited:…

那年高考

每年高考&#xff0c;都会让我想起很多事情。我第一次高考前几天&#xff0c;我舅舅和舅娘过来看我&#xff0c;他们拉我到教室后门&#xff0c;我舅说我妈叮嘱他一定来看我&#xff0c;然后跟我说不要给自己太大压力&#xff0c;啰嗦了几分钟&#xff0c;要走的时候硬塞给我10…

vimdiff的简单使用

Vimdiff的使用 1、首先vimdiff是一款高效的文件的比较和合并的工具&#xff0c;它具有以下一些特点&#xff1a;命令行方式的比较工具&#xff1b;简单明了的界面&#xff1b;对比较出来的多处差异之间快速定位&#xff1b;进行文件合并。再使用vimdiff命令之前&#xff0c;我们…