======================= 大爽歌作,made by big shuang =======================
一、基于类的视图(Class-based views)介绍
1 介绍
Class-based views (CBVs) are views generated from models.
Class-based views:基于模型自动生成的视图。
在web开发中,为模型(models)制作各种各样的视图是工作量很大的事情,
Class-based views简化了这些工作。
2 代码
CBVs可以直接使用,例如在urls.py
里直接使用CreateView
来添加学生实例。
其中每个参数的意思我们在本文最后面解释
from django.urls import path
from django.views.generic import CreateView
from my_app.views import login
from my_app import view
from my_app.models import Student
urlpatterns = [
path('login/', login.page, name="login"),
path('hello/', view.hello),
path('register', CreateView.as_view(model=Student, template_name="register.html", success_url='login',fields="__all__"),
name="register"),
]
其中register.html
如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
Login
</title>
</head>
<body>
<div>Register</div>
<div>
<form method="post">
{% csrf_token %}
{{form.as_p}}
<p><input type="submit" value="Register"/></p>
</form>
</div>
</body>
</html>
Student
模型见Django自学笔记 4-1 模型(Models)介绍中的示例。
其他代码见本专栏之前博客(实际上本文用不到)
此时运行项目后注册页面如下
3 继承使用
上面举得例子是在urls.py
中调用类方法as_view
,指定对应的参数,去生成视图。
然而这样写不好拓展,修改起来也麻烦。
所以一般来说,更推荐在views.py
中去继承CBVs,从而设置编写自己需要的视图类
再在urls.py
中不传参调用as_view
方法
比如上面的
CreateView.as_view(model=Student, template_name="register.html", success_url='login',fields="__all__"),
name="register")
推荐改为在views.py
去编写一个新的类CreateStudentView
,
其中每个属性的意思我们在本文最后面解释
class CreateStudentView(CreateView):
model = Student
fields="__all__"
template_name = "user/register.html"
success_url = "login"
然后urls.py
中的register
的path
就可以改为
path('register', CreateStudentView.as_view(), name="register"),
4 常用介绍
Django 实现了很多种CBVs。
他们都使用类方法as_view
来获得视图函数,只不过参数可能会不同。
对于初学者,首先常用到的是一些通用的编辑视图Generic editing views
这些视图都在django.views.generic.edit
中,有以下几种
FormView
CreateView
UpdateView
DeleteView
一般来讲,对于编辑视图,都有以下属性
model
: 该视图所对应的模型fields
: 哪些字段可展示编辑form_class
:使用哪种表单来展示这个模型template_name
:渲染该视图使用的模板success_url
:指定编辑成功后跳转的页面
补充1:fields
和form_class
这两个参数互斥,必须且只能设置其中一个。
补充2:DeleteView
无fields
、form_class
属性
Django还有些其他的视图,实际开发中,也可能常需要用到,具体可查阅官方文档:
class-based-views