通用视图

通用视图介绍

通用视图把视图开发中常用的写法和模式抽象出来,让你编写少量代码就能快速实现常见的数据视图。显示对象列表就是这样一种任务。

有了通用视图,可以把模型作为额外的参数传给 URL 配置。Django 自带的通用视图能实现下述功能:

  • 列出对象并显示单个对象的详细信息。如果创建一个管理会议的应用程序,那么TalkListView 和RegisteredUserListView就是列表视图。某一个演讲的页面就是详细信息视图。

  • 呈现基于日期的对象,显示为年月日归档页面(带有详细信息),以及“最新”页面。

  • 让用户创建、更新和删除对象——需不需要授权都行。

具体使用示例及说明

示例展示的是一个查询出所有厂家及根据URl中传入的厂家名称查询出此厂家生产的所有商品的示例:

视图函数如下(在项目view.py下定义):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from cerealsOils.models import Manufacturers, Product
from django.views.generic import ListView
from django.shortcuts import get_object_or_404

# Create your views here.

# 定义通用视图
class ManufacturersList(ListView):
# 注意此行代码表示:其实是queryset = Publisher.objects.all() 的简洁形式。
# model = Manufacturers

# 动态过滤
# 根据 URL 中指定的键过滤列表页面中的对象
# 我们可以覆盖ListView 的 get_queryset() 方法。它的默认实现是返回queryset 属性的值,不过我们可以添加更多逻辑
# 这里根据url中传入的厂家名称,过滤出指定厂家生产的产品
def get_queryset(self):
# 获取到GET请求捕获到的参数
self.manu = get_object_or_404(Manufacturers, name=self.args[0])
# 过滤
return Product.objects.filter(manufacturers=self.manu)

# 提供“友好的”模板上下文,如果我们不自已定义模板上下文名称,默认会将上述查询结果存储在名为 object_list 的变量中
# 现在我们将它存储在 manu_list 变量中
context_object_name = "product_list"
# 自定义了模板名称,既指定使用的模板
# 如果没明确指定,Django 将从对象的名称中推知。这里,推知的模板是cerealsOils/manufacturers_list.html
template_name = 'manu_list.html'

# 提供额外的上下文变量
# 就是扩展DetailView,自己实现get_context_data 方法,然后在此方法提供额外的数据
# 这里查询出所有的厂家返回给页面
def get_context_data(self, **kwargs):
# 先调用原来的实现,获取上下文
context = super(ManufacturersList, self).get_context_data(**kwargs)
# 查询出所有的产品
context['manu_list'] = Manufacturers.objects.all()
return context

url定义如下:

1
2
3
4
urlpatterns = [
# 注意 as_view() 函数
url(r'^manulist/([\w-]+)$', views.ManufacturersList.as_view())
]

模板代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<meta charset='UTF-8'>
<title>通用视图测试</title>
</head>
<body>
<h1>厂家名称</h1>
{% for manu in manu_list %}
<li>{{ manu.name }}</li>
{% endfor %}
<hr>
<h1>产品名称</h1>
{% for prod in product_list %}
<li>{{ prod.title }}</li>
{% endfor %}
<hr>
<p>谢谢光临</p>
</body>
</html>

以上便是通用视图的实现,是不是很方便呢!

最后更新: 2019年08月11日 20:01

原始链接: https://jjw-story.github.io/2019/08/11/Djongo-03/

× 请我吃糖~
打赏二维码