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的使用的更多相关文章

  1. Python自动化之modelform和原生ajax

    modelform验证 `views.py` from django.shortcuts import render,HttpResponse from app01 import models fro ...

  2. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  3. django(7)modelform操作及验证、ajax操作普通表单数据提交、文件上传、富文本框基本使用

    一.modelForm操作及验证 1.获取数据库数据,界面展示数据并且获取前端提交的数据,并动态显示select框中的数据 views.py from django.shortcuts import ...

  4. Django——form组件和ModelForm

    一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...

  5. web框架-(七)Django补充---models进阶操作及modelform操作

    通过之前的课程我们可以对于Django的models进行简单的操作,今天了解下进阶操作和modelform: 1. Models进阶操作 1.1 字段操作 AutoField(Field) - int ...

  6. Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志

    12-3. 数据库连接日志 问题 你想为每次与数据库的连接和断开记录日志 解决方案 EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和 ...

  7. 【Django】--ModelForm组件

    ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...

  8. MySQL字符串的‘123’转换为数字的123

    方法一:SELECT CAST('123' AS SIGNED);方法二:SELECT CONVERT('123',SIGNED);方法三:SELECT '123'+0;

  9. 杭电1597--find the nth digit--假设:S1 = 1,S1=12,S3=123,S4=1234...

    我是把它分层来求的,也就是说第一层是1,第二层是12,第三层是123......你们该懂的!! #include <iostream>#include <cmath>using ...

随机推荐

  1. MySQL8.0 ROW_NUMBER、RANK、DENSE_RANK窗口函数 分组排序排名

    MySQL8.0 (ROW_NUMBER)窗口函数 排名 暂时理解函数意义,后面再进行优化,如果有关变量排序,查看这个大哥的 mysql的分组排序和变量赋值顺序 先查看一个例子: # 按照每科课程分数 ...

  2. word2vec生成后缀名model文件处理

    引入from gensim.models import word2vec 读取test02.model里面的词· model = word2vec.Word2Vec.load('test02.mode ...

  3. Java Juc学习笔记

    Java JUC 简介 在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括 ...

  4. 关于c++的头文件和变量声明

    写再最前面:摘录于柳神的笔记:   C++的头⽂件⼀般是没有像C语⾔的 .h 这样的扩展后缀的,⼀般情况下C语⾔⾥⾯的头⽂件去掉 .h 然 后在前⾯加个 c 就可以继续在C++⽂件中使⽤C语⾔头⽂件中 ...

  5. jarvisoj fm

    使用指令 checksec 查看保护情况 Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PI ...

  6. PCSearch需要管理员权限,开机自启

    1.添加Windows服务,并设为自动启动: 2.通过服务启动AutoStartSevice.exe,通过AutoStartSevice.exe运行AutoStart.bat,通过AutoStart. ...

  7. 建小程序 - 报Error: EPERM : operation not permitted, scandir mac下改变一个目录的访问权限

    问题:用微信开发者工具,建一个小程序,报错(见图1): 建小程序 - 报Error: EPERM : operation not permitted, scandir 解决: 1.打开终端 2.cd ...

  8. Codeforces1301B. Motarack's Birthday

    题意是说给你一串数组,其中-1代表未知,求相邻两个数之差的绝对值最小,-1可以由k赋值,先考虑-1的情况,把k解出来,转换一下,就是绝对值之差最小情况,|k-a|,|k-b|,|k-c|,要使最大的最 ...

  9. 关于Lab3中对于正则表达式的应用

    在这里记录一下关于软件构造课程Lab3中关于正则表达式的应用. 在实验内容中,要求用正则表达式来匹配读入文件的内容,从而取得构建图需要的相关信息. 举个例子,读入的文件(GraphPoetTestFi ...

  10. docker学习笔记-05:DockerFile解析

    一.DockerFile是什么 1.DockerFile是用来构建docker镜像的构建文件,是由一系列参数和命令构成的脚本. 2.构建三步骤: 手动编写一个dockerfile文件,然后直接dock ...