clean()方法的简单应用
clean()方法主要用于验证相互依赖的字段,例如注册时,填写的“密码”和“确认密码”要相等时才符合要求。
在调用表单clean() 方法的时候,所有字段的验证方法已经执行完(表单字段的默认验证(如CharField())和特定字段属性的验证(clean_<fieldname>)),所以self.cleaned_data 填充的是目前为止已经合法的数据。所以你需要记住这个事实,你需要验证的字段可能没有通过初试的字段检查。(例如你要验证“密码”和“确认密码”是否相等,但或许它们没有通过初始字段检查,例如格式错误等,但仍会执行这一步)
在这一步,有两种方法报告错误。你可以在clean() 方法中抛出ValidationError 来创建错误。例如:
forms.py
1 from django import forms
class RegisterForms(BaseForm, forms.Form):
password = forms.CharField()
confirm_password = forms.CharField() def clean(self):
cleaned_data = super(RegisterForms, self).clean() # 注意,super(RegisterForms, self).clean() 的调用时为了保证维持父类中的验证逻辑。
v1 = cleaned_data.get('password')
v2 = cleaned_data.get('confirm_password')
if v1 == v2:
pass
else:
raise ValidationError(message='密码输入不一致', code='invalid') #错误信息保存在errors.__all__中
view.py
def register(request):
if request.method == 'GET':
return render(request, 'register.html') elif request.method == 'POST':
obj = RegisterForms(request=request, data=request.POST)
if obj.is_valid():
pass
else:
error = obj.errors
return render(request, 'register.html', {'errors': error, 'obj':obj}) #因为要在HTML中把errors.__all__显示出来,所以要把实例化的obj传过去
register.html
1 <form method='post' action='/register.html'>
<div class="form-group">
<label for="password">密码</label>
<input type="password" class="form-control" id="password" name="password" placeholder="请输入密码">
<p>
{{ errors.password.0 }}
{{ obj.non_field_errors.0 }} #显示共有的错误信息
</p>
</div> </form>
第二种方法涉及将错误消息关联到某个字段。在这种情况下,让我们在表单的显示中关联一个错误信息到“password” 。例如:
from django import forms class RegisterForms(BaseForm, forms.Form):
password = forms.CharField()
confirm_password = forms.CharField() def clean(self):
cleaned_data = super(RegisterForms, self).clean()
v1 = cleaned_data.get('password')
v2 = cleaned_data.get('confirm_password')
if v1 == v2:
pass
else:
msg = '密码输入不一致'
self.add_error('password', msg)
此时错误信息是关联到password上的,因为不用传递实例化的obj,在register.html上也只需写上"{{ errors.password.0 }}"
clean()方法的简单应用的更多相关文章
- jQuery.clean()方法源码分析(一)
在jQuery 1.7.1中调用jQuery.clean()方法的地方有三处,第一次就是在我之前的随笔分析jQuery.buildFramgment()方法里面的,其实还是构造函数的一部分,在处理诸如 ...
- ListView与.FindControl()方法的简单练习 #2 -- ItemUpdting事件中抓取「修改后」的值
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/24/listview_itemupdating_findcontrol_201 ...
- js实用方法记录-简单cookie操作
js实用方法记录-简单cookie操作 设置cookie:setCookie(名称,值,保存时间,保存域); 获取cookie:setCookie(名称); 移除cookie:setCookie(名称 ...
- Django form表单功能的引用(注册,复写form.clean方法 增加 验证密码功能)
1. 在app下 新建 forms.py 定义表单内容,类型models from django import forms class RegisterForm(forms.Form): userna ...
- 关于js的对象创建方法(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)
// 1.工厂方式创建对象:面向对象中的封装函数(内置对象) 简单来说就是封装后的代码,简单的工厂模式是很好理解的,关于它的作用,就是利用面向对象的方法,把一些对象封装,使一些占用空间多的,重复的代码 ...
- 原生JS取代一些JQuery方法的简单实现
原生JS取代一些JQuery方法的简单实现 下面小编就为大家带来一篇原生JS取代一些JQuery方法的简单实现.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.选 ...
- 伪数组(arguments及字符串)转数组的方法 贼简单
超简单的伪数组转数组的方法, 简单到令人发指! (这里伪数组使用arguments) 1.使用 Array.prototype.slice Array.prototype.slice.call(arg ...
- DBMS_OUTPUT.PUT_LINE()方法的简单介绍
1.最基本的DBMS_OUTPUT.PUT_LINE()方法. 随便在什么地方,只要是BEGIN和END之间,就可以使用DBMS_OUTPUT.PUT_LINE(output);然而这会有一个问题,就 ...
- [ 转载 ] Java基础10--关于Object类下所有方法的简单解析
关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...
随机推荐
- 任务调度Quartz.Net之Windows Service
这个应该是关于Quartz.Net使用的最后一篇文章了,之前的介绍都是基于Web的,这种实现任务调度的方式很少见,因为不管是MVC.WebApi还是WebService,它们都需要寄宿在IIS上运行, ...
- Debian10.1用wine打开Windows工具乱码总结
由于之前的deepin15.11莫名其妙挂了(就是使用一般没做啥特殊操作就挂了,不过有可能是我的移动固态硬盘也有锅),所以这次决定装Debian10.1版本, 由于安装时选择语言环境是中文的话创建的一 ...
- php实现映射
目录 映射 实现 链表实现: 二叉树实现 复杂度分析 映射 映射,或者射影,在数学及相关的领域经常等同于函数.基于此,部分映射就相当于部分函数,而完全映射相当于完全函数. 映射(Map)是用于存取键值 ...
- Mac中设置Sublime快速在终端中使用命令打开项目
工作中用Atom比较多,比较喜欢Atom可以直接在终端中直接输入atom .就能直接打开项目的功能,于是搜索得知sublime text也有这样的功能,下面就简单的配置了一下: sudo ln -s ...
- Python03之单引号、双引号、三单引号、三双引号
今天在学习字符串的时候,发现字符串有时使用单引号,有时使用双引号,而有时还使用三引号.至此我整理如下: 单引号和双引号区别.三单引号和三双引号也没什么区别. 一: 两单引号之间不可以出现单引号,如果出 ...
- Burp Suite的安装与使用
Burp Suite是一个集成化的渗透测试工具,它集合了多种渗透测试组件,使我们自动化地或手工地能更好的完成对web应用的渗透测试和攻击.在渗透测试中,我们使用Burp Suite将使得测试工作变 ...
- 史上最全最新Java面试题合集一(附答案)
下面小编整理了本套java面试题全集,分享给大家,希望对大家的java学习和就业面试有所帮助. 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征 ...
- go context 源码分析
WithCancel func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { c := newCancelCtx(pare ...
- Stack Overflow是如何做应用缓存的
首先要说下缓存是什么?缓存,就是在取出数据结果后,暂时将数据存储在某些可以快速存取的位置(例如各种NoSQL如Redis,HBase,又或MemoryCache等等),于是就可以让这些耗时的数据结果多 ...
- ubuntu环境下pycharm编译程序import包出错:ImportError: dynamic module does not define init function (init_caffe)
出错原因是因为pycharm中的python版本不对,比如程序为2.7版本,但是pycharm编解释器为python3,导致出错,去setting改一下版本就行:pycharm>file> ...