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),
]
|
Django之ModelForm验证相关推荐
- Django之Form验证clean方法(验证篇六)
上一篇:Django之Form验证select的choice选项数据从数据库实时调用(验证篇五)点击跳转 目录篇:Django之Form及ModelForm目录篇 点击跳转 下一篇:django之mo ...
- Django 表单验证之自定义表单验证器
本文基于Django 表单验证 一文,补充完善表单验证器之自定义表单验证器 具体步骤总结如下: 第一:在formValidation.py 文件中,添加自定义名称敏感验证器(NameValidatio ...
- Django Form ModelForm modelfromset
forms 组件 Form 组件 form表单完成的事情 提供input可以提交数据 对提交的数据进行校验 提供错误提示 定义form组件 from django import forms class ...
- Django之modelform
1.原生form表单 2.forms组件2 3.modleForm组件 4.前端form表单,后台form组件(可以没有数据库) 5.django补充 - 请求流程 1.原生form表单 步骤: 1. ...
- Django之ModelForm详解
前言 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来.先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱 ...
- Django之ModelForm使用
一:什么是ModelForm呢? Model + Form ==> ModelForm.model和form的结合体,所以有以下功能: 数据验证 数据库操作 model有操作数据库的字段,for ...
- django 的用户验证及登录状态保持
一.用户验证功能 Django自带用户验证及登录功能,引入模块为: from django.contrib.auth import authenticate 其中方法authenticate()的接收 ...
- Django之session验证的三种姿势
一.什么是session session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中. 二.FVB中 ...
- Django的ModelForm
这个组件的功能就是把model和form组合起来 1.创建ModelForm 1.model.py中创建模型表 class Book(models.Model):title=models.CharFi ...
最新文章
- 使用了这个神器,让我的代码bug少了一半
- Ubuntu系统安装libssl-dev
- Echart遇到的问题:tooltip提示框大小异常
- 根据坐标点鼠标 不移动_CAD移动鼠标时,鼠标右下角有坐标提示,怎么取消?...
- 【Python】Python时间序列之calendar模块
- P2617 Dynamic Rankings(带修主席树)
- Java 是如何优雅地实现接口数据校验的?
- Windows Server 2008 活动目录备份的几种方法
- wpf demo (gif , multithredading,httpwatch)
- JAVA发送邮件案例
- t-paas d-paas_什么是PaaS? 平台即服务的解释
- codeup27943 星号实心六边形
- 杨立昆最新访谈:AI威胁论是蒙昧主义,控制欲只有人才有 (全文+视频)
- 【MySQL】连接查询
- 【正则表达式】从字符串中提取数字
- Long Short Term Memory networks(LSTMs)
- 基于单片机的多功能电子医药盒设计
- BLDC无刷电机6步换向步骤简述
- 实现在H5中唤起抖音APP
- 求网络号,广播地址,第一个可用ip,最后一个可用ip。可用ip总数