Django 通用视图

在某些情况下,正如我们之前看到的那样,编写视图确实很麻烦。想象一下,您需要一个静态页面或列表页面。Django 提供了一种简单的方法来设置这些简单的但是通用的视图,这些视图就被称为通用视图。

与经典视图不同,通用视图是类而不是函数。Django 在 django.views.generic 中为通用视图提供了一组类,每个通用视图都是这些类中的一个或从其中一个继承的类。

下面先让我们查看一下 Django 为我们提供了哪些通用视图类。

$ python3 manage.py shell

进入编码界面

>>> import django.views.generic
>>> dir(django.views.generic)
['ArchiveIndexView', 'CreateView', 'DateDetailView', 'DayArchiveView', 'DeleteView', 'DetailView', 'FormView', 'GenericViewError', 'ListView', 'MonthArchiveView', 'RedirectView', 'TemplateView', 'TodayArchiveView', 'UpdateView', 'View', 'WeekArchiveView', 'YearArchiveView', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'base', 'dates', 'detail', 'edit', 'list']
>>>

看起来,Django给我们提供的通用视图类还挺多,下面我们通过一个例子,来看一下通用视图类该如何使用。

静态页面

首先,让我们新建一个模板 static.html,使用这个模板来发布一个静态页面

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Django 通用视图-迹忆客</title>
</head>
<body>
这是一个静态页面
</body>
</html>

如果按照之前学习的方式,接下来我们应该在 app/views.py 视图文件中新建一个 static 视图函数

def static(request):
    return render(request, "static.html")

然后就是在 app/urls.py 路由文件中新建一个路由,如下代码

from django.urls import path, re_path

from . import views

urlpatterns = [
    path('hello/', views.hello),
    path('static/', views.static)
]

然后重启服务,访问结果如下

Django 经典视图访问

显然,这不是最好的方式。最好的方法是使用通用视图。下面我们开始对上面的代码进行改造。

首先我们对 app/views.py 视图文件进行改造

from django.views.generic import TemplateView

class StaticView(TemplateView):
   template_name = "static.html"

然后去修改 app/urls.py 中的路由

from django.urls import path, re_path

from . import views
from .views import StaticView

urlpatterns = [
    path('hello/', views.hello),
    path('static/', StaticView.as_view())
]

重启服务之后依然可以正常访问到我们的静态页面

Django 经典视图访问

还有一种方式就是更加简单,只需要修改 app/urls.py 即可,static 路由如下

from django.urls import path, re_path
from django.views.generic import TemplateView

from . import views

urlpatterns = [
    path('hello/', views.hello),
    path('static/', TemplateView.as_view(template_name='static.html'))
]

这样也可以正常访问我们的 static.html 模板提供的静态页面。 这种方式有一个好处就是如果我有另一个静态模板 static2.htm

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Django 通用视图-迹忆客</title>
</head>
<body>
这是第二个静态页面
</body>
</html>

然后我们不再需要在 app/views.py 中添加通用视图类,只需要在 app/urls.py 中添加一条路由即可

from django.urls import path, re_path
from django.views.generic import TemplateView

from . import views

urlpatterns = [
    path('hello/', views.hello),
    path('static/', TemplateView.as_view(template_name='static.html')),
        path('static2/', TemplateView.as_view(template_name='static2.html'))
]

现在我们重启服务,访问 /app/static2 可以正常访问到 static2.html 静态页面

Django 通用视图访问

展示数据库数据

下面我们列出 UserModel 模型中的所有数据。这个操作可以通过 ListView 通用视图类轻松完成。下面我们更新 app/urls.py 文件

from django.urls import path, re_path
from django.views.generic import TemplateView, ListView

from .models import UserModel

urlpatterns = [
    path('hello/', views.hello),
    path('userlist/', ListView.as_view(model=UserModel, template_name="user_list.html"))
]

这里需要注意的是,默认情况下 ListView.as_view 传递给模板的变量名称是object_list, 如果想要自己重新命名变量的名称,则需要给as_view传递一个参数context_object_name。代码如下

from django.urls import path, re_path
from django.views.generic import TemplateView, ListView

from .models import UserModel

urlpatterns = [
    path('hello/', views.hello),
    path('userlist/', ListView.as_view(model=UserModel, template_name="user_list.html", context_object_name = ”users_objects”))
]

然后编辑我们的 user_list.html 模板

{% extends "main_template.html" %}
{% block title %}Django 通用视图 - 迹忆客{% endblock %}

{% block content %}
UserModel 数据:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}

重启服务,访问 /app/userlist 可以正常访问,结果如下

Django 通用视图类ListView

查看笔记

扫码一下
查看教程更方便