django 通用视图——迹忆客-ag捕鱼王app官网
在某些情况下,正如我们之前看到的那样,编写视图确实很麻烦。想象一下,您需要一个静态页面或列表页面。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,使用这个模板来发布一个静态页面
django 通用视图-迹忆客
这是一个静态页面
如果按照之前学习的方式,接下来我们应该在 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
django 通用视图-迹忆客
这是第二个静态页面
然后我们不再需要在 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 数据:
{% for dr in object_list %}
{{dr.name}}
{% endfor %}
{% endblock %}
重启服务,访问 /app/userlist 可以正常访问,结果如下