基于类的通用视图(Class-based generic views)
2014-11-12 16:20
260 查看
from:http://www.cnblogs.com/huafeng/p/3273315.html
在web开发中,最令人头痛的就是一遍又一遍的重复固定的模式。在解决了模板层面和模型层面的重复代码之痛之后,Django使用通用视图来解决视图层面的代码重复。扩展通用视图
毫无疑问通用视图可以大幅度地加速web开发,但是在许多项目中,总是有通用视图不够用的时候。确实,现今的Django开发者们需要知道如何让通用视图可以处理更多的纷繁复杂的场景。
这是1.3版本的通用视图被重新设计的原因之一。以前,通用视图只是一些带有一些扑朔迷离选择的视图函数,现在更加推荐的方法是通过继承、重写属性或方法来扩展视图函数,而不是在URLconf中进行大量的配置。
对象的通用视图
TemplateView确实不错,但是Django的通用视图真正大显身手的场景是在展现数据库内容的时候。因为这是如此普遍的任务,Django提供了一系列内置的通用视图来使编写展示对象细节的视图变得如此灵活、简单。
让我们先来看一看展示一系列对象和单个对象的一些例子,下面是将要用到的模型:
注意:自动寻找模板的功能仅在django.template.loaders.app_diretories.Loader被启用的情况下可行(在TEMPLATE_LOADERS中设置)
这个模板将会使用一个叫object_list的变量来渲染,这个变量包含了所有的publisher对象。一个简单的模板看起来可能会像这样:
让template context变得更加友好
你可能已经注意到了,在我们例子中,所有的publisher都保存在变量object_list中,这是默认的变量名。当然你也可用另一个:publisher_list,如你所想,publisher是模型的名字,这是Django为你提供的第二选择。如果你仍然觉得这个名字不完美,你也可以自己命名,方法是在通用视图中添加context_object_name变量:
增加额外的context
通常你需要展示一些通用视图没有提供的信息,比如展示所有每个publisher写的所有的书。DetailView通用视图给context提供publisher信息,那我们如何在模板中获得额外的信息呢?
答案就是继承DetailView,并重写get_context_data方法。默认的方法只是简单的展示对象,但是我们可以重写让它展示更多:
让我们近距离地观察一下model参数。model参数指明了我们将操作的数据库模型,所有的通用视图都有这个参数。但是这个参数并不是指明对象的唯一方法。你也可以使用queryset参数来指明一系列对象:
动态过滤
另一个需求可能是你想要通过URL中的参数来过滤对象。在上个例子中,我们将publisher的名字硬编码在URLconf中,如果您想展示任意publisher的书籍又该怎么办呢?
很简单,我们可以重写ListView的get_queryset()方法。
这里,我们使用命名组来获得URL中的参数:
最后我们关注一下在调用通用视图的前后做一些额外的工作。
想象一下我们的Author模型有一个last_accessed字段来保存上次该作者被访问的时间:
首先,我们需要在URLconf中增加一个作者信息来指向视图:
相关文章推荐
- Django Class-based generic views 基于类的通用视图
- 基于类的通用视图(Class-based generic views)
- 用基于类的通用视图处理表单(Class-based generic views)
- 用基于类的通用视图处理表单(Class-based generic views)
- 深入Django(1): 通用视图 (generic views) [转]
- 千与千寻django(六)---通用视图(Generic views)
- Django学习笔记之:【通用视图 (generic views) 】
- 深入Django(1): 通用视图 (generic views)
- django的通用视图 (generic views)
- django使用通用视图 django.views.generic
- class based generic view
- django class-based-views
- django rest framework 入门3——Class Based Views
- Django-Rest-Framework 教程: 3. 使用 class based views
- Sencha Touch 2 官方文档翻译之 Using Views in your Applications(使用视图)
- The BulkProcessor class offers a simple interface to flush bulk operations automatically based on th
- Django views视图请求对象HttpRequest
- GenericClassInherit
- getclass.getGenericsupperclass
- GenericUserBasedRecommender推荐过程分析