一、简介
Django中Model负责操作数据库,并且具有简单的数据库验证功能(基本不用);Form用于用户请求的验证,具有强悍的数据库验证功能;ModelForm是将二者合二为一,即可用于数据库操作(部分),也可用于用户请求的验证(部分)!但由于ModelForm的耦合性太强,其作用一般用作于结构简单的小站点或者重写Django Admin,其实Django Admin就是利用ModelForm的功能实现的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# 示例
# modelForm.py
from
django
import
forms
from
app01
import
*
class
BookModelForm(forms.ModelForm):
class
Meta:
model
=
Book
fields
=
"__all__"
# 所有字段
# fields = ["title", "price"] # 指定某些字段
exclude
=
[
"price"
]
# 排除某些字段
labels
=
{
"title"
:
"输入书名"
}
# 修改提示信息
help_texts
=
{
"title"
:
"*"
}
# 帮助提示信息
widgets
=
{
"title"
: ws.Textarea}
# 使用widgets插件
error_messages
=
{
"title"
: {
"required"
:
"必填"
}}
# 定义错误信息
# models.py
class
Book(models.Model):
title
=
models.CharField(max_length
=
100
, verbose_name
=
"书名"
)
authors
=
models.ManyToManyField(Author)
publisher
=
models.ForeignKey(Publisher, verbose_name
=
"出版社"
)
publication_date
=
models.DateField(null
=
True
)
price
=
models.DecimalField(max_digits
=
5
, decimal_places
=
2
, default
=
10
, verbose_name
=
"价格"
)
def
__str__(
self
):
return
self
.title
|
既然ModelForm的缺点那么多,我们为什么还要使用ModelForm呢?直接使用Form不是更好么?实际开发过程中,没有什么最好的,只有最合适的。ModelForm在某些环境下,优点多多啊!ModelForm不必像Form一样写一大堆的验证规则,大家有没有发现其实Form中很多的条件跟Model中定义字段设置的条件一模一样的,只不过Model不会做验证而已,就相当于一模一样的东西写了两份。
但是在ModelForm就不必了,你只需写上四行简单的代码就可以套用Model中已经定义好的规则来使用!如下所示,就这么简单。你在Model字段中定义的最大值,最小值,Email字段验证等等,已经通通生效了!
1
2
3
4
5
6
|
from
django
import
forms
class
BookModelForm(forms.ModelForm):
class
Meta:
model
=
Book
fields
=
"__all__"
# 所有字段
|
二、ModelForm参数
1
2
3
4
5
6
7
8
|
class
Meta:
model
# 对应Model的表名
fields
# 需要显示的字段,“__all__”代表所有字段,也可以写成元组或列表方式
exclude
# 排除的字段,后面跟列表或元组
labels
# 提示信息,后面跟字典
help_texts
# 帮助提示信息,后面跟字典
widgets
# 自定义插件,需要先导入widgets模块
error_messages
# 自定义错误信息,后面跟字典
|
三、ModelForm验证过程
ModelForm跟Form一样,也具有自动生成HTML代码的功能,请看以下示例。当第一次发送GET请求时,利用ModelForm自动生成HTML代码的功能,自动生成前端代码。当第二次前端发送POST请求时,先用is_valid验证数据,这一步是必须做的,不写这一步,ModelForm怎么验证!
如果is_valid()=True,clean()中保存所有正确的信息;如果is_valid()=FALSE,errors中保存着错误信息,使用as_json()把HTML无序列表代码转换成字典。
我在前面说了,ModelForm也具有部分数据库操作功能,save()方法可以直接将数据保存到数据库中。需要有一点要注意的,生成ModelForm对象时,如果里面不包含instance参数就是新数据插入,有instance就是更新。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
# views.py
def
book2(request, bid):
if
request.method
=
=
'GET'
:
obj
=
Book.objects.get(
id
=
bid)
form
=
BookModelForm(instance
=
obj)
return
render(request,
"book2.html"
,
locals
())
elif
request.method
=
=
'POST'
:
obj
=
Book.objects.get(
id
=
bid)
form
=
BookModelForm(request.POST, instance
=
obj)
# 这里如果不加Instance就成了插入,加入就是更新
if
form.is_valid():
print
(form.clean())
form.save()
else
:
print
(form.errors.as_json())
return
render(request,
"book2.html"
,
locals
())
# book2.html
<!DOCTYPE html>
<html lang
=
"en"
>
<head>
<meta charset
=
"UTF-8"
>
<title>Title<
/
title>
<
/
head>
<body>
<form action
=
"/edit_book_{{ bid }}/"
method
=
"post"
>
{
%
csrf_token
%
}
{{ form.as_p }}
<
input
type
=
"submit"
value
=
"submit"
>
<
/
form>
<
/
body>
<
/
html>
# urls.py
urlpatterns
=
[
url(r
'^admin/'
, admin.site.urls),
url(r
'^edit_book_(\d+)/'
, views.book2),
]
|