Django的通用视图是在总结了一些在视图开发中常用的代码和模式的基础上,进行封装形成的一种编写视图的方式。通用视图通过简单的配置或少量代码就可以快速编写出能实现常用功能的视图。最常使用的通用视图有3个:TemplateView、List View和Detail View

TemplateView类通用视图

TemplateView一般在展示模板文件时使用

例子:

编写视图:

from django.views.generic import TemplateView

class template(TemplateView):
    template_name = 'test.html'
    def get_context_data(self, **kwargs):
        context=super(template,self).get_context_data(**kwargs)
        context['test']="测试"
        return context

代码首行通过“from django.views.generic import TemplateView”导入TemplateView类通用视图模块。

通用视图通过继承方式建立一个类,而不是定义一个函数。test_templateview 类中template_name指定模板文件的位置,这个模板文件的位置由settings.py中TEMPLATES列表的DIRS决定。

TemplateView类中的get_context_data()可以增加新的模板变量,变量以字典的形式传递,字典键名就是传到模板文件的变量名,可以用{{变量名}}的形式存放在模板文件中。

设置路由:

usrl.py中

path('template/',template.as_view()),

基于类的通用视图在调用时以函数的形式而不能以类的形式被调用。需要把类视图用 as_view()转化成函数,才能被调用。

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{ test }}</h1>
</body>
</html>

HTML代码中的{{ test }}就是类视图的get_context_data()返回context字典中的一个键名,它会被Django模板引擎解析为“这是一个要传递的变量”的字符串来显示。

运行结果:

Django-基于类的通用视图_python

List View类通用视图基本知识

例子:

编写视图函数

from app import models
from django.views.generic import ListView
class test_listView(ListView):
    model = models.name
    template_name = 'test.html'
    context_object_name = "name_list"

代码首行导入List View类相关模块。

视图类中model属性指定了数据模型(Model),即确定数据记录的来源。指定这个属性是要取出name数据库表中的所有数据,功能相当于dep_list =models.name.objects.all(),其中name_list是context_object_name指定的名字。

template_name属性指定了需要渲染的模板文件,在本应用程序中模板文件的位置实际为test.html。

context_object_name指定了模板中使用的上下文变量(模板变量),指定这个属性就是把变量name_list传递给了test.html模板。

如果在类中给model属性设置了数据模型,就会取出该数据模型中所有的数据。如果查询的数据需要过滤条件或者对数据进行有条件选取时,需要通过重写List View中的get_queryset()方法来实现。

在类中通过context_object_name属性来指定传递的模板变量,如果要增加新的模板变量,可以通过重写get_context_data()方法来实现。

测试

设置路由

path('list/',test_listView.as_view()),

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% for i in name_list %}
<h1>{{ i.name }}</h1>
{% endfor %}
</body>
</html>

运行结果:

Django-基于类的通用视图_数据_02

对比数据库

Django-基于类的通用视图_后端_03

实现过滤

取id 1到5的数据

from app import models
from django.views.generic import ListView
class test_listView(ListView):
    model = models.name
    template_name = 'test.html'
    context_object_name = "name_list"
    def get_queryset(self):
        name_list=models.name.objects.filter(id__range=(1,5))
        return name_list

Django-基于类的通用视图_django_04

重写父类的get_context_data()增加模板变量

from app import models
from django.views.generic import ListView
class test_listView(ListView):
    model = models.name
    template_name = 'test.html'
    context_object_name = "name_list"
    def get_queryset(self):
        name_list=models.name.objects.filter(id__range=(1,5))
        return name_list
    def get_context_data(self, *, object_list=None, **kwargs):
        kwargs['name']=models.name.objects.all()
        return super(test_listView,self).get_context_data(**kwargs)

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>{{ name.name }}</h1>

</body>
</html>

Django-基于类的通用视图_后端_05

Detail View类通用视图

List View 用于获取数据模型多条数据的列表,获取的是对象的集合。如果要获取数据模型的单个对象,就需要用Detail View类通用视图。Detail View类获取单个对象时,需要指定主键进行查询选择,因此给配置项的URL表达式设置一个参数,以便传递一个主键值进行查询。

编写视图

from app import models
from django.views.generic import DetailView
class datailview(DetailView):
    models=models.name
    template_name = 'test.html'
    context_object_name = 'name'
    pk_url_kwarg = 'id'
    def get_object(self, queryset=None):
        obj=super(datailview,self).get_object()
        return obj

 
urls:

path('list/<int:id>',datailview.as_view()),
  • 视图通过model属性指定从name数据库表中取数据,取出的数据存放在context_object_name指定的name变量中;template_name指定了模板文件的路径。

  • pk_url_kwarg属性指定的是URL配置项中URL参数名,它指的就是urls.py的配置项path('list/<int:id>',datailview.as_view())中角括号里面的int类型的URL参数personid。举例说明,如果浏览器地址中输入的是/127.0.0.1:8000/list/4,视图则通过models.name.objects.get(id=4)取得一条记录数据。

  • 视图类重写get_object()方法,代码首先通过 obj = super(datailview,self).get_object()调用父类的get_object()生成一条数据记录对象

    html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <h1>{{ name.name }}</h1>
    
    </body>
    </html>
    

Django-基于类的通用视图_数据_06

Django-基于类的通用视图_django_07