在Django的通用视图中处理Context的方法

 更新时间:2015年07月21日 15:28:29   投稿:goldensun  
这篇文章主要介绍了在Django的通用视图中处理Context的方法,Django是最具人气的Python web开发框架,需要的朋友可以参考下

制作友好的模板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 后面没有括号;这表示这是一个函数的引用,并没有真正调用它(通用视图将会在渲染时调用它)。

相关文章

  • Django权限机制实现代码详解

    Django权限机制实现代码详解

    这篇文章主要介绍了Django权限机制实现代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 基于python内置函数与匿名函数详解

    基于python内置函数与匿名函数详解

    下面小编就为大家分享一篇基于python内置函数与匿名函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Python获取excel的数据并绘制箱型图和直方图的方法实例

    Python获取excel的数据并绘制箱型图和直方图的方法实例

    这篇文章主要给大家介绍了关于Python获取excel的数据并绘制箱型图和直方图的相关资料,好的图表能帮助我们深化数据的记忆点,文中通过图文以及代码示例将实现的方法介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • python轻松实现代码编码格式转换

    python轻松实现代码编码格式转换

    由于某些原因,需要将代码从A机房迁移到B机房,这两个之间不能互相访问,但是历史原因导致A机房的代码全是utf8编码的,B机房要求是GBK编码,看看这个怎么解决。虽然很简单,但是还是要推荐给大家,需要的小伙伴参考下吧。
    2015-03-03
  • 基于Django ORM、一对一、一对多、多对多的全面讲解

    基于Django ORM、一对一、一对多、多对多的全面讲解

    今天小编就为大家分享一篇基于Django ORM、一对一、一对多、多对多的全面讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 用Python写一个自动木马程序

    用Python写一个自动木马程序

    这篇文章主要介绍了用Python写一个自动木马程序的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Pytorch 和 Tensorflow v1 兼容的环境搭建方法

    Pytorch 和 Tensorflow v1 兼容的环境搭建方法

    这篇文章主要介绍了搭建Pytorch 和 Tensorflow v1 兼容的环境,本文是小编经过多次实践得到的环境配置教程,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • Python中合并列表的5种方法代码示例

    Python中合并列表的5种方法代码示例

    在python列表操作中除了排序、删除、添加、去重外,合并也是经常需求的操作,下面这篇文章主要给大家介绍了关于Python中合并列表的5种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • 用python实现词云效果实例介绍

    用python实现词云效果实例介绍

    大家好,本篇文章主要讲的是用python实现词云效果实例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 一文带你了解Python与svg之间的操作

    一文带你了解Python与svg之间的操作

    svgwrite是一个 Python 库,用于生成简单的 SVG 图片。它提供了一组类似于绘图的 API,使用者可以在 SVG 画布上画线、矩形、圆等图形。本文主要介绍了如何利用svgwrite进行SVG图片的操作,需要的可以参考一下
    2023-01-01

最新评论