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 ...
随机推荐
- Python - 同时运行两个以上的脚本
在c.py中 import os os.system("python a.py") os.system("python b.py")
- scrapy 中 shell 出现 403 Forbiidden 解决方案
版权声明本文来自:https://blog.csdn.net/qq_37462361/article/details/87860025 进入正题: 出现 403,表示网站拒绝提供服务 (因为很多网站都 ...
- 面试官:说说Spring中的事务传播行为
前言 在开发中,相信大家都使用过Spring的事务管理功能.那么,你是否有了解过,Spring的事务传播行为呢? Spring中,有7种类型的事务传播行为.事务传播行为是Spring框架提供的一种事务 ...
- broadcom sdk command
1.查看端口link状态 BCM.0>ps 2.查看vlan BCM.0>vlan show 3.查看pvlan BCM.0>pvlan show 4.CPU发包 BCM.0> ...
- SpringBoot笔记二:整合篇
Spring Boot与缓存 jsr-107 Java Caching定义了5个核心接口分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry. ...
- 五 Action访问方法,method配置,通配符(常用),动态
1 通过method配置(有点low) 建立前端JSP:demo4.jsp <%@ page language="java" contentType="text/h ...
- Struts2学习(四)
struts-defualt.xml指定的result的类型 1.struts-defualt.xml 文件的 181 行 开始定义了: <result-types> <result ...
- 「Luogu P2824 [HEOI2016/TJOI2016]排序」
一道十分神奇的线段树题,做法十分的有趣. 前置芝士 线段树:一个十分基础的数据结构,在这道题中起了至关重要的作用. 一种基于01串的神奇的二分思想:在模拟赛中出现了这道题,可以先去做一下,这样可能有助 ...
- Linux centosVMware shell中的函数、shell中的数组、
一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...
- ch8 固定宽度、流式、弹性布局
假设浏览器窗口设置为1250px:wrapper的宽度为960px:content的宽度为920px:确保了wrapper居中时两边有20px的间距: secondary的宽度为230px: pr ...