[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 ...
随机推荐
- 20145238-荆玉茗 《Java程序设计》实验三
20145238-荆玉茗-实验三 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营 ...
- 如何在linux服务器部署Rstudio server,配置ODBC远程访问win 服务器上的SQL server
如何在linux服务器部署Rstudio server,配置ODBC后通过RODBC包远程访问SQL server 背景介绍:之前写过一篇文章,提到近期要部署Rstudio server(搭建数据分析 ...
- 【洛谷P1314】[NOIP2011]聪明的质监员
聪明的质监员 题目链接:https://www.luogu.org/problemnew/show/P1314 Y(W)随W的值增大而减小 二分W的值,找到最小的W使得Y(W)>S: 比较Y(W ...
- 在什么情况下采用BFC
介绍BFC的博文有很多,下面,我就从另一个角度解释一下“在什么情况下会使用BFC” 以下仅代表我的个人看法,如果有错误的地方,还希望大家能告诉我,以免我在错误的道路上越走越远. 一.BFC是什么 Bl ...
- data-ng-repeat 指令
data-ng-repeat指令对于集合中的每一项会克隆一次HTML元素.
- 最近的阅读list
fast rcnn 统一了sppnet和rcnn,将原来rcnn分stage的训练合为一个整体的stage,一次完成cls, regression的训练.引入两个loss函数,一个是用来进行cls的, ...
- linux下Mycat的安装配置
1.下载Mycat Linux版:下载链接 2.通过SSH直连工具把安装包丢到linux:/usr/local/ 3.解压安装Mycat 4.配置环境 5.使配置文件生效
- 一篇RxJava友好的文章(二)
上一篇文章介绍了rxjava的基本用法,和一些常用的操作符,以及rxjava的链式操作带来的好处.由于rxjava非常的强大,让我如此的痴迷,我打算写五篇文章,专门讲解rxjava 常见的操作符和用法 ...
- Nginx的编译安装及服务启动脚本
1.解决依赖关系 编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Libraries".同时,还需 ...
- python__基础 : 类的 __slots__ 方法
实例在创建出来之后,可以动态的添加属性和方法, 那如果想要限制添加的实例属性,可以用一下 __slots__ 这个东西: class Test(object): __slots__ = ('name' ...