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)
]
然后重启服务,访问结果如下
显然,这不是最好的方式。最好的方法是使用通用视图。下面我们开始对上面的代码进行改造。
首先我们对 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())
]
重启服务之后依然可以正常访问到我们的静态页面
还有一种方式就是更加简单,只需要修改 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 静态页面
展示数据库数据
下面我们列出 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 可以正常访问,结果如下