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. 文本输入框UITextField和UITextView

    本文概要 1.简介 2.介绍TextField控件 3.介绍TextView控件 4.键盘的打开和关闭 5.关闭和大开键盘的通知 6.键盘的种类 详情 1.简介 与Label一样,TextField和 ...

  2. Lesson 16 The modern city

    What is the author's main argument about the modern city? In the organization of industrial life the ...

  3. 十一 三种Struts2的数据封装方式,封装页面传递的数据

    Struts2的数据封装:Struts2是一个web层框架,框架是软件的半成品.提供了数据封装的基本功能. 注:Struts2底层(核心过滤器里面的默认栈里面的拦截器,具体见struts-defaul ...

  4. 用Jackson进行Json序列化时的常用注解

    Jackson时spring boot默认使用的json格式化的包,它的几个常用注解: @JsonIgnore 用在属性上面,在序列化和反序列化时都自动忽略掉该属性 @JsonProperty(&qu ...

  5. Spring学习(二)

    IoC 1.Inverse of Control ,控制反转(控制权的翻转) 2.控制:对对象的创建.对对象的属性赋值等一系列操作本来应该是我们做的事情 Java Application : Date ...

  6. 关于盒模型的外边距padding和内边距margin

    边框border属性值  solid实线   dashed虚线   dotted点线   double双实线 /* 内边距 */padding:20px 30px 30px 30px;若有四个值代表  ...

  7. Linux命令:ip命令

    ip命令功能:配置网络属性 一.ip link 系列 ip link ip [-s] link show        # 查看默认信息 ip link show eth0 ip link show ...

  8. iframe结构的网站按F5刷新子页面的实现方式

    有的网站或者后台系统由于页面有公共的部分,比如菜单,会把公共的部分放在一个页面,这里称之为父页面,而把具体的内容放入一个iframe中,之后的请求改变iframe的内容.但是这样会有一个问题,因为浏览 ...

  9. CSS3-多列(column-count等)

    CSS3 多列属性 属性 描述 column-count 指定元素应该被分割的列数. column-fill 指定如何填充列 column-gap 指定列与列之间的间隙 column-rule 所有 ...

  10. js加密(十一)yhz566 md5

    1. http://www.yhz566.com/ 2. 登录加密 3. navigator = {}; var rng_psize = 256; var b64map = "ABCDEFG ...