在Django的通用视图中处理Context的方法
作者:goldensun 发布时间:2023-02-25 20:50:45
制作友好的模板Context
你也许已经注意到范例中的出版商列表模板在变量 object_list 里保存所有的书籍。这个方法工作的很好,只是对编写模板的人不太友好。 他们必须知道这里正在处理的是书籍。 更好的变量名应该是publisher_list,这样变量所代表的内容就显而易见了。
我们可以很容易地像下面这样修改 template_object_name 参数的名称:
from django.conf.urls.defaults import *
from django.views.generic import list_detail
from mysite.books.models import Publisher
publisher_info = {
'queryset': Publisher.objects.all(),
'template_name': 'publisher_list_page.html',
'template_object_name': 'publisher',
}
urlpatterns = patterns('',
(r'^publishers/$', list_detail.object_list, publisher_info)
)
在模板中,通用视图会通过在template_object_name后追加一个_list的方式来创建一个表示列表项目的变量名。
使用有用的 template_object_name 总是个好想法。 你的设计模板的合作伙伴会感谢你的。
添加额外的Context
你常常需要呈现比通用视图提供的更多的额外信息。 例如,考虑一下在每个出版商的详细页面显示所有其他出版商列表。 object_detail 通用视图为context提供了出版商信息,但是看起来没有办法在模板中 获取 所有 出版商列表。
这是解决方法: 所有的通用视图都有一个额外的可选参数 extra_context 。这个参数是一个字典数据类型,包含要添加到模板的context中的额外的对象。 所以要给视图提供所有出版商的列表,我们就用这样的info字典:
publisher_info = {
'queryset': Publisher.objects.all(),
'template_object_name': 'publisher',
**'extra_context': {'book_list': Book.objects.all()}**
}
这样就把一个 {{ book_list }} 变量放到模板的context中。 这个方法可以用来传递任意数据 到通用视图模板中去,非常方便。 这是非常方便的
不过,这里有一个很隐蔽的BUG,不知道你发现了没有?
我们现在来看一下, extra_context 里包含数据库查询的问题。 因为在这个例子中,我们把 Publisher.objects.all() 放在URLconf中,它只会执行一次(当URLconf第一次加载的时候)。 当你添加或删除出版商,你会发现在重启Web服务器之前,通用视图不会反映出这些修改(有关QuerySet何时被缓存和赋值的更多信息请参考附录C中“缓存与查询集”一节)。
备注
这个问题不适用于通用视图的 queryset 参数。 因为Django知道有些特别的 QuerySet 永远不能 被缓存,通用视图在渲染前都做了缓存清除工作。
解决这个问题的办法是在 extra_context 中用一个回调(callback)来代替使用一个变量。 任何传递给extra_context的可调用对象(例如一个函数)都会在每次视图渲染前执行(而不是只执行一次)。 你可以象这样定义一个函数:
**def get_books():**
**return Book.objects.all()**
publisher_info = {
'queryset': Publisher.objects.all(),
'template_object_name': 'publisher',
'extra_context': **{'book_list': get_books}**
}
或者你可以使用另一个不是那么清晰但是很简短的方法,事实上 Publisher.objects.all 本身就是可以调用的:
publisher_info = {
'queryset': Publisher.objects.all(),
'template_object_name': 'publisher',
'extra_context': **{'book_list': Book.objects.all}**
}
注意 Book.objects.all 后面没有括号;这表示这是一个函数的引用,并没有真正调用它(通用视图将会在渲染时调用它)。
猜你喜欢
- 我们都知道Jupyter notebook更换主题后看着会很舒服,但是有个问题主题更换后工具栏不显示了。usename$ jt -lAvai
- 本博客将为各位分享Python Helium库,其是在 Selenium库基础上封装的更加高级的 Web 自动化工具,它能够通过网页端可见的
- 一直以来都是用python脚本,执行的时候就是在终端直接命令执行,或者直接输入代码执行,最近为了方便他人使用,想做个界面,可以通过里面的控件
- logging分为4个模块: loggers, handlers, filters, and formatters.●loggers: 提供
- 问题:如何在报表中每隔N行显示一条粗线如何为报表增加一个行号列?回答:1、在设计模式里打开该报表,在报表主体里面加一个TextBox,把Na
- 权限级别划分如下:①、院长和财务科长:不能输入,可以无限制查询、统计;②、副院长:不能输入,可以查询、统计其分管部门的帐务;③、部门领导:不
- Swagger是一个API开发者的工具框架,用于生成、描述、调用和可视化RESTful风格的Web服务。总体目标是使客户端和文件系统服务器以
- 每天换一个壁纸,每天好心情。# -*- coding: UTF-8 -*- from __future__ import unicode_l
- Python是动态语言,在创建对象后,可以动态地绑定属性和方法定义类:class Student: #定义类 &nb
- 对于一个多元函数,用最速下降法(又称梯度下降法)求其极小值的迭代格式为其中为负梯度方向,即最速下降方向,αkαk为搜索步长。一般情况下,最优
- 1 引子 Java,C#等各种高级语句的开发工具琳琅满目,争放异彩。但作为AJAX的主角的JavaScri
- 1.SGD随机梯度下降随机梯度下降和其他的梯度下降主要区别,在于SGD每次只使用一个数据样本,去计算损失函数,求梯度,更新参数。这种方法的计
- 1、基础概念什么是网络编程?指在网络环境中,如何实现不在同一物理位置中的计算机之间进行数据通信如果要保证数据通信顺利完成,则需要先了解如下几
- 本文实例为大家分享了python实现学生信息管理系统的具体代码,供大家参考,具体内容如下代码如下:Project.py文件内容:class
- 前言:处理图片需要,需把图片都转换成1920*1280的大小, python实现很方便,需要导入图片处理的Image包和匹配的glob包,很
- 我自己的一个项目,需要同时对65536个文件进行多次写操作。如果先全部打开所有的文件,然后重复写,最后关闭所有的文件。那么第一次写操作全部完
- 本文所述实例为Python处理文本文件并生成指定格式文件的方法,具体实现功能代码如下所示:import osimport sysimport
- 前言本文主要给大家介绍了关于python图片添加半透明水印的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧示例代码
- 阅读上一篇:一个完美网站的101项指标.第三部分.易用性 设计体现了一个网站的艺术素养,然而并不是说您应当过分设计,设计风格应结合您的行业,
- 微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注。微软在开源项目上的参与力度是越