Django之ModelForm验证

简介:

一、简介

    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
相关文章
|
8月前
|
存储 安全 网络协议
Python 教程之 Django(9)对模型中的字段进行验证
Python 教程之 Django(9)对模型中的字段进行验证
67 0
Python 教程之 Django(9)对模型中的字段进行验证
|
JSON 算法 安全
Django JWT验证
Django JWT验证
166 0
|
1月前
|
数据采集 中间件 Python
如何在Django框架中进行输入验证和过滤?
通过综合运用这些方法,可以在 Django 框架中有效地进行输入验证和过滤,提高应用的安全性和数据质量。同时,还可以根据具体的业务需求进一步扩展和定制验证逻辑。
118 64
|
7月前
|
存储 搜索推荐 数据库
Web实战丨基于Django与HTML的用户登录验证系统
Web实战丨基于Django与HTML的用户登录验证系统
156 1
|
存储 数据库 Python
Python 教程之 Django(9)对模型中的字段进行验证
Python 教程之 Django(9)对模型中的字段进行验证
70 0
|
中间件 Python
Python编程:Django中间件实现登陆验证
Python编程:Django中间件实现登陆验证
208 8
Python编程:Django中间件实现登陆验证
|
XML JSON 前端开发
【Django学习笔记 - 17】:序列化和反序列化(restful接口小案例、DRF的工程搭建、序列化器与序列化、验证、保存)
【Django学习笔记 - 17】:序列化和反序列化(restful接口小案例、DRF的工程搭建、序列化器与序列化、验证、保存)
550 0
【Django学习笔记 - 17】:序列化和反序列化(restful接口小案例、DRF的工程搭建、序列化器与序列化、验证、保存)
|
缓存 安全 前端开发
Python编程:Django之安全验证
Python编程:Django之安全验证
226 0
|
缓存 前端开发 安全
Python编程:Django之安全验证
涉及内容 装饰器 cookie session form验证 缓存 中间件 信号 csrf 分页
226 0
|
Web App开发 前端开发 数据库
Django中的ModelForm
一、ModelForm的基本用法示例: from django import forms from app01 import models class BookModelForm(forms.
1180 0

热门文章

最新文章