[oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息
form后台生成form里面的Input标签,以及设置Input的属性
# 需求 后台生成form里面的input标签,并设置input标签的属性,
class RegisterForm(Form):
email = fields.EmailField()
password = fields.CharField()
password2 = fields.CharField()
code = fields.CharField()
avatar = fields.FileField(widget=widgets.FileInput(attrs={'id': 'inputAvatar'})) def register(request):
if request.method == 'GET':
obj = RegisterForm()
return render(request, 'register.html', {'obj': obj}) <form method="POST" action="/register/" enctype="multipart/form-data">
{% csrf_token %}
{{ obj.avatar }}
{{ obj.usernam }}
</form>
向在form里面获取session值,即传递request参数
# form标签向获取request里面的值--重写__init__函数
def __init__(self, request, *args, **kwargs):
self.request = request
super(RegisterForm, self).__init__(*args, **kwargs)
form验证某个字段 self.clean_字段名
# form标签验证某个字段
def clean_code(self):
input_code = self.cleaned_data.get('code')
session_code = self.request.session.get('code') # 请查看check_code函数
if input_code != session_code:
raise ValidationError('验证码错误')
else:
return input_code
# self.errors = {'code': ['验证码错误'], 'xx':[错误1,错误2]}
form验证多个字段 self.clean
# form标签联合数据验证
def clean(self):
"""
此时,已经拿到所有的input值,对两次输入密码进行验证
"""
p1 = self.cleaned_data.get('password1')
p2 = self.cleaned_data.get('password2')
if p1 != p2:
raise ValidationError('两次输入密码不一致') # 默认放到self.errors['__all__']里面
else:
return self.cleaned_data
# return None
"""
self.errors = {'__all__': ['两次输入密码不一致'], 'xx':[错误1,错误2]}
NON_FIELD_ERRORS = '__all__' 前台获取需要用到
此时前端获取该错误; obj.non_field_errors
"""
form验证多个字段 self.clean 指明错误信息的Key,方便前端使用
# 对整体错误的其他设置
def clean(self): if p1 != p2:
self.add_error('password2', '两次输入密码不一致')
# 此时不用抛出异常了,因为抛出异常
# 抛出异常也是执行self.add_error
return None
else:
return self.cleaned_data 此时在前端显示该错误: obj.errors.password2
form 的错误信息self.errors
# form标签数据验证错误信息
self.errors = {'username':[错误1, 错误2], 'password': [错误1, 错误2]}
def clean_xx(self) 如果遇到错,放到self.errors['xx']里面
def clean(self) 如果遇到错,放到self.errors['__all__']里面 但是如果要前端获取self.errors['__all__']错误,obj.errors.__all__是拿不到的
而是obj.non_field_errors, 不是self.errors.non_fields_errors
注册form
# 完整的forms.py
# -*- coding: utf-8 -*-
from django.forms import Form, fields, widgets
from django.core.exceptions import ValidationError class RegisterForm(Form):
username = fields.CharField(widget=widgets.TextInput(
attrs={'class': "form-control"}
))
password = fields.CharField(widget=widgets.PasswordInput(
attrs={'class': "form-control"}
))
password2 = fields.CharField(widget=widgets.PasswordInput(
attrs={'class': "form-control"}
))
code = fields.CharField(widget=widgets.TextInput(
attrs={'class': "form-control"}
))
avatar = fields.FileField(widget=widgets.FileInput(attrs={'id': 'inputAvatar'})) def __init__(self, request, *args, **kwargs):
self.request = request
super(RegisterForm, self).__init__(*args, **kwargs) def clean_code(self):
input_code = self.cleaned_data.get('code').upper()
session_code = self.request.session.get('code').upper() # 请查看check_code函数
if input_code != session_code:
raise ValidationError('验证码错误')
else:
return input_code
# self.errors = {'code': ['验证码错误'], 'xx':[错误1,错误2]} def clean(self):
"""
此时,已经拿到所有的input值,对两次输入密码进行验证
"""
p1 = self.cleaned_data.get('password')
p2 = self.cleaned_data.get('password2')
if p1 != p2:
self.add_error('password2', '两次输入密码不一致') # 此时不用抛出异常了,因为抛出异常
# 抛出异常也是执行self.add_error
return None
# raise ValidationError('两次输入密码不一致')
# 默认放到self.errors['__all__']里面
# 执行的是self.add_error('__all__', '两次输入密码不一致')
else:
return self.cleaned_data """
self.errors = {'__all__': ['两次输入密码不一致'], 'xx':[错误1,错误2]}
NON_FIELD_ERRORS = '__all__' 前台获取需要用到
"""
[oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息的更多相关文章
- jquery获取form表单内容以及绑定数据到form表单
在日常开发的过程中,难免会用到form表单,我们需要获取表单的数据保存到数据库,或者拿到后台的一串json数据,要将数据绑定到form表单上,这里我写了一个基于jquery的,formHelp插件,使 ...
- Django 11 form表单(状态保持session、form表单及注册实现)
Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...
- Django 提交 form 表单(使用sqlite3保存数据)
优化 提交 form 表单,https://www.cnblogs.com/klvchen/p/10608143.html 创建数据库的字段,在 models.py 中添加 from django.d ...
- JavaScript之form表单的序列化和json化[form.js]
一.应用场景 form提交时,使用ajax提交. 二.效果 通过本工具,实现表单所有form的快速序列化和json化,使前端人员在ajax提交form表单的时,脱离重复性的,大劳动量的手动抽取form ...
- Ajax提交form表单内容和文件(jQuery.form.js)
jQuery官网是这样介绍form.js A simple way to AJAX-ify any form on your page; with file upload and progress s ...
- form表单转换为Json字符串数据
https://github.com/marioizquierdo/jquery.serializeJSON 效果图 加载使用 <script type="text/javascrip ...
- form表单嵌套,用标签的form属性来解决表单嵌套的问题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 由form表单来说说前后台数据之间的交互
为什么从表单提交说起呢?因为大部分与后台的交互都是在form表单中实现,恰巧我入职一个月来都是在处理与后台交互的数据整合中度过,期间也发现一些小坑,出于喜欢总结,所以才想写这篇小博客. 各位童鞋,可以 ...
- 过滤器中获取form表单或url请求数据
var httpFormData = filterContext.HttpContext.Request.Form; var logContent = string.Empty; //获取url的 l ...
随机推荐
- linq 和lambda查询
EF 查询的两种 写法. linq 方法 或者 lambda方法 其中 ,只有tolist()的时候,才会真正的 在数据库中执行. 如果没有 tolist 方法,那么province1是 iqueab ...
- Node.js 的初体验
例子1: 1.首先第一步 :要 下载 node.js. 官网 上可以下载 下载完后,是这个玩意. 2. 打开 node.js ,然后输入 // 引入http模块 var http = require( ...
- iOS新浪微博OAuth2.0认证代码
#import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...
- jquery 标签中的属性操作
.arrt() 获取匹配的元素集合中的第一个元素的属性值,或设置每一个元素中的一个或多个属性值. .attr(attributeName) $("em").attr("t ...
- 洛谷P2759 奇怪的函数(log 二分)
题目描述 使得 x^xxx 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^xxx 达到 n 位数字的最小正整数 x 输入输出样例 输 ...
- Spring Cloud 入门Eureka -Consumer服务消费(一)
这里介绍:LoadBalancerClient接口,它是一个负载均衡客户端的抽象定义,下面我们就看看如何使用Spring Cloud提供的负载均衡器客户端接口来实现服务的消费. 引用之前的文章中构建的 ...
- intellij中导入java包
- tcl之控制流-foreach
- RepeatMasker使用
RM是library-based,通过相似性比对来识别重复序列,可以屏蔽序列中转座子重复序列和低复杂度序列(默认将其替换成N).使用数据库Dfam和Repbase. The Dfam database ...
- source insight插件
直使用sourceinsight编辑C/C++代码,sourceinsight是一个非常好用的编辑工具可以任意定位,跳转,回退,本人一直 使用该工具做C/C++开发,sourceinsight能够满足 ...