经常碰到这种情况,需要调用某个模板,但可能存在不同的逻辑条件。如果为每个不同的逻辑条件都写个视图,则每个视图里都要单独指定模板文件并进行渲染,造成代码冗余。
因此可以引入通用视图,ListView
和DetailView
,这两个视图分别抽象“显示一个对象列表”和“显示一个特定类型对象的详细信息页面”这两种概念。
使用通用视图优点:实现视图中最基本的模板调用和渲染功能,并可以加入通用的逻辑条件。在遇到需要使用其他逻辑条件的情况,可以新建一个类并继承该通用视图,在新类里重写逻辑条件,而无需再次指定和渲染模板,减少代码冗余。
ListView
ListView
用来获取指定的数据列表
下面建立了一个通用视图BookListView
,用来显示已上架的图书列表,请注意:
urls.py
中调用的是as_view()
方法- 默认模板为
<app name>/<model name>_list.html
,使用template_name
来指定模板文件 - 查询获得的数据,传递给模板时所使用的变量名默认格式是
<model name>_list
,使用context_object_name
可以指定变量名
# books/views.py
from django.views.generic import ListView
from .models import Book
class BookListView(ListView):
# 指定模型
model = Book
# 指定模板
template_name = 'books/book_list.html'
# 从模型中查询获得的数据,传递给模板时所使用的变量名