123.ModelForm的使用
ModelForm
在我们的实例中,需要通过models.py中定义相关的模型字段,之后在forms.py中同样需要定义每个字段进行相应的验证,这样的话,我们会需要重复定义,这样的话,就相对比较麻烦,所以为了简化我们的操作。我们可以使用ModelForm,将二者进行结合。
1.models.py文件中示例代码如下:
from django.db import models
from django.core import validators
class User(models.Model):
username = models.CharField(max_length=100)
password = models.CharField(max_length=24)
telephone = models.CharField(max_length=11, validators=[validators.RegexValidator(r"1[345678]\d{9}")])
class Meta:
db_table = 'user'
2.forms.py文件中直接指定model 这个属性的值,并且指定fields="all",就可以将model模型中的所有字段都复制过来,可以在提交表单的时候进行验证,示例代码如下:
from django import forms
from .models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
# field可以指定在进行表单验证的时候,该模型中定义的字段中有哪个字段参数了验证
# “__all__:方法可以指定该模型中所有的字段都需要进行验证”
# 同样,也可以使用列表指定模型中的一部分字段参与验证,
# 如果参与验证的字段比较多,而不参与验证的字段比较少的话,就可以使用exclude进行排除不参与验证的字段
fields = '__all__'
# field = ['username','telephone']
# exclude = ['price']
<!--定义各个字段错误信息-->
error_messages = {
'username': {
'invalid':'输入的用户名无效',
'required': '请输入用户名',
'max_length': '最大长度不能超过100',
},
'password': {
'invalid': '输入的密码不符合要求',
'required': '请输入密码',
},
'telephone': {
'invalid': '输入的手机号无效',
'required': '输入手机号',
},
}
3.在views.py文件中定义视图函数(在这里只是定义采用POST请求向数据库提交数据,如果提交的数据合法,就会保存到数据库中,如果不合法,就会打印出相关的错误信息),示例代码如下:
from django.shortcuts import render
from django.http import HttpResponse
from .models import User
from .forms import UserForm
# 采用POST请求访问User表,进行提交数据
def user_view(request):
<!--实例化对象-->
form = UserForm(request.POST)
<!--判断对象的各个字段是否满足要求,如果满足要求的话,就提取出所有的字段的值-->
if form.is_valid():
<!--1.提取数据,并进行保存到数据库中-->
<!--username = form.cleaned_data.get('username')-->
<!--password = form.cleaned_data.get('password')-->
<!--telephone = form.cleaned_data.get('telephone')-->
<!--将提取出的数据保存到数据库中-->
<!--User.objects.create(username=username, password=password, telephone=telephone)-->
<!--2.以上提取数据,并且进行保存的方式比较繁杂,。因此如果我们在使用form表单进行验证的时候,如果验证了复制的模型的所有字段值的合法性,就可以直接通过form.save()进行提取所有使用POST请求传送过来的数据,并且进行保存到数据库中-->
form.save()
return HttpResponse('success')
else:
<!--打印出相关的错误信息-->
print(form.errors.get_json_data())
return HttpResponse('FAIL')
在Postman中可以采用POST请求提交相关字段的信息,同样可以保存到数据库中。
在我们注册的时候我们需要,传入username,pwd1(密码),pwd2(确认密码),telephone,而在我们的模型User中只有username,password,telephone,所以在我们的数据库中只需要存储username,password,telephone就可以了。但是在我们的views.py文件中我们还想要直接使用form.save()进行提取数据和保存到数据库中,应该怎么操作呢???
views.py文件中示例代码如下:
<!--导入装饰器required_POST-->
from django.views.decorators.http import required_POST
# 使用装饰器required_POST,定义只能使用POST请求访问该视图
@require_POST
def register_view(request):
form = registerForm(request.POST)
if form.is_valid():
<!--在使用save()方法进行提取和保存数据的时候,可以指定一个参数commit=False,就会生成一个user模型,但是并不会将所有的数据添加到数据库中进行保存。-->
user = form.save(commit=False)
print(type(user))
<!--<class 'Modelform.models.User'>-->
<!--之后就可以为模型的其他属性添加相应的值了-->
user.password = form.cleaned_data.get('pwd1')
user.save()
return HttpResponse('success')
else:
<!--调用定义好的简化提取错误信息的函数-->
print(form.get_errors())
return HttpResponse('Fail')
同时要在forms.py文件中添加以下代码:
# 注意这里一定要是继承forms.ModelForm
class registerForm(forms.ModelForm):
# 重写两个字段进行验证
pwd1 = forms.CharField(max_length=24, min_length=6)
pwd2 = forms.CharField(max_length=24, min_length=6)
class Meta:
model = User
fields = ['username','telephone']
def get_errors(self):
new_errors = {}
errors = self.errors.get_json_data()
for key,message_dicts in errors.items():
messages = []
for message_dict in message_dicts:
message = message_dict['message']
messages.append(message)
new_errors[key] = messages
return new_errors
def clean(self):
clean_data = super().clean()
pwd1 = clean_data.get('pwd1')
pwd2 = clean_data.get('pwd2')
# 判断两次输入的密码是否一致
if pwd1 != pwd2:
raise forms.ValidationError('两次密码输入不一致!')
return clean_data
在Postman中采用POST请求提交数据

在数据库中进行查看,数据已经添加到数据库中了:

123.ModelForm的使用的更多相关文章
- Python自动化之modelform和原生ajax
modelform验证 `views.py` from django.shortcuts import render,HttpResponse from app01 import models fro ...
- python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)
一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...
- django(7)modelform操作及验证、ajax操作普通表单数据提交、文件上传、富文本框基本使用
一.modelForm操作及验证 1.获取数据库数据,界面展示数据并且获取前端提交的数据,并动态显示select框中的数据 views.py from django.shortcuts import ...
- Django——form组件和ModelForm
一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...
- web框架-(七)Django补充---models进阶操作及modelform操作
通过之前的课程我们可以对于Django的models进行简单的操作,今天了解下进阶操作和modelform: 1. Models进阶操作 1.1 字段操作 AutoField(Field) - int ...
- Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志
12-3. 数据库连接日志 问题 你想为每次与数据库的连接和断开记录日志 解决方案 EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和 ...
- 【Django】--ModelForm组件
ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...
- MySQL字符串的‘123’转换为数字的123
方法一:SELECT CAST('123' AS SIGNED);方法二:SELECT CONVERT('123',SIGNED);方法三:SELECT '123'+0;
- 杭电1597--find the nth digit--假设:S1 = 1,S1=12,S3=123,S4=1234...
我是把它分层来求的,也就是说第一层是1,第二层是12,第三层是123......你们该懂的!! #include <iostream>#include <cmath>using ...
随机推荐
- Python3.5学习之旅——day4
本节内容 1.装饰器 2.迭代器与生成器 3.内置方法 4.软件目录结构规范 一.装饰器 装饰器是一个用来装饰其他函数的工具,即为其他函数添加附加功能,其本质就是函数. 装饰器需要遵循的以下两个原则: ...
- 面试问题之——给你图片的url,你能知道它所占的字节空间吗?
从一个需求说起 这标题起得有点标题党,实际情况是我最近在做一个公司内部工具时,遇到了这么一个需求,给定一个静态资源站点上某张图片的url(比如https://a.xxxcdn.com/demo.jpg ...
- 关于TXT文件中英文单词出现频率排序问题
题目要求: 指定文件目录, 但是会递归遍历目录下的所有子目录,输出文件中所有不重复的单词,按照出现次数由多到少排列. 源码: package word; import java.io.File; i ...
- 使用SQL语句还原数据库 2012.3.20
--返回由备份集内包含的数据库和日志文件列表组成的结果集. --主要获得逻辑文件名 USE master RESTORE FILELISTONLY FROM DISK = 'g:\back.Bak' ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:为所有表格的单元格添加边框
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Spring Cloud Hystrix 请求熔断与服务降级
在Java中,每一个HTTP请求都会开启一个新线程.而下游服务挂了或者网络不可达,通常线程会阻塞住,直到Timeout.你想想看,如果并发量多一点,这些阻塞的线程就会占用大量的资源,很有可能把自己本身 ...
- 使用myeclipse搭建简单的maven工程
请点击或者复制以下链接 http://opiece.me/2016/03/17/maven-and-ssmframework/
- 手搓SSM
相关资料,网上的资料很多,但是文章看不懂,看别人写好的代码比较好理解 ssm-example mysssm 整个流程和原理 一个入口类,入口类需要在tomcat启动的时候执行 通过扫描文件加把文件取出 ...
- Day11 - K - Good Luck in CET-4 Everybody! HDU - 1847
大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考 ...
- vbs操作IE对象
Dim fso,filepath,i 'Dim ExcelBook,ExcelSheet,MyExcelBook,MyExcelSheet Dim ie Set ie=WScript.CreateOb ...