Django之ModelForm验证

本文介绍 Django 中 ModelForm 的使用方法及应用场景,通过实例展示了如何利用 ModelForm 自动生成 HTML 表单并进行数据验证,同时探讨了 ModelForm 相比普通 Form 的优势。

一、简介

    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),
]


本文转自戴柏阳的博客博客51CTO博客,原文链接http://blog.51cto.com/daibaiyang119/1977895如需转载请自行联系原作者


daibaiyang119
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值