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()方法的简单应用的更多相关文章

  1. jQuery.clean()方法源码分析(一)

    在jQuery 1.7.1中调用jQuery.clean()方法的地方有三处,第一次就是在我之前的随笔分析jQuery.buildFramgment()方法里面的,其实还是构造函数的一部分,在处理诸如 ...

  2. ListView与.FindControl()方法的简单练习 #2 -- ItemUpdting事件中抓取「修改后」的值

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/24/listview_itemupdating_findcontrol_201 ...

  3. js实用方法记录-简单cookie操作

    js实用方法记录-简单cookie操作 设置cookie:setCookie(名称,值,保存时间,保存域); 获取cookie:setCookie(名称); 移除cookie:setCookie(名称 ...

  4. Django form表单功能的引用(注册,复写form.clean方法 增加 验证密码功能)

    1. 在app下 新建 forms.py 定义表单内容,类型models from django import forms class RegisterForm(forms.Form): userna ...

  5. 关于js的对象创建方法(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)

    // 1.工厂方式创建对象:面向对象中的封装函数(内置对象) 简单来说就是封装后的代码,简单的工厂模式是很好理解的,关于它的作用,就是利用面向对象的方法,把一些对象封装,使一些占用空间多的,重复的代码 ...

  6. 原生JS取代一些JQuery方法的简单实现

    原生JS取代一些JQuery方法的简单实现 下面小编就为大家带来一篇原生JS取代一些JQuery方法的简单实现.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   1.选 ...

  7. 伪数组(arguments及字符串)转数组的方法 贼简单

    超简单的伪数组转数组的方法, 简单到令人发指! (这里伪数组使用arguments) 1.使用 Array.prototype.slice Array.prototype.slice.call(arg ...

  8. DBMS_OUTPUT.PUT_LINE()方法的简单介绍

    1.最基本的DBMS_OUTPUT.PUT_LINE()方法. 随便在什么地方,只要是BEGIN和END之间,就可以使用DBMS_OUTPUT.PUT_LINE(output);然而这会有一个问题,就 ...

  9. [ 转载 ] Java基础10--关于Object类下所有方法的简单解析

    关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...

随机推荐

  1. nvidia jetson tx2 刷机遇到的问题解决

    一.主要信息 使用的开发板:nvidia jetson tx2(内存8g有wifi的版本) 使用的JetPack版本: 4.2.2 二.遇到的问题及解决 1. 刷好jetson os 后,开发板一直在 ...

  2. Mybatis笔记3

    Mybatis映射文件的SQL深入 (Mybatis今天学的不多,看了半天的mysql必知必会) 动态sql语句-if语句,查询一个用户的时候,有可能根据地址查询,用户名查询,性别查询等,所以需要动态 ...

  3. Python对象的引用、可变性和垃圾回收

    1.标识.相等性和别名 别名的例子 >>> charles = {'name': 'Charles L. Dodgson', 'born': 1832} >>> l ...

  4. vue 写一个瀑布流插件

    效果如图所示: 采用了预先加载图片,再计算高度的办法..网络差的情况下,可能有点卡 新建 vue-water-easy.vue  组件文件 <template> <div class ...

  5. 采用二进制方式安装K8S集群,版本etcd-v3.3.10,flannel-v0.11.0,kubernetes-server-linux-amd64

    官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...

  6. 将double转化成string,并保持N位小数

    double dumpSize = (1024000000.1415926535897932384 * 1.0) / 1024 / 1024; string tempStr = to_string(d ...

  7. hoj 棋盘问题 状压入个门

    大概题意是:有一个n*m的棋盘,在这个棋盘里边放k个旗子,要求每一行每一列都不能存在一对旗子相邻,问最后总共的方案数. 我们先来考虑个简单的,假如说只有一行,要求在这一行里边填充k个旗子,要求任意两个 ...

  8. Spring Bean的作用域以及lookup-method标签的使用

    Spring Framework支持五种作用域,如下图所示: singleton:表示一个容器中只会存在一个bean实例,无论在多少个其他bean里面依赖singleton bean,整个容器都只会存 ...

  9. 线程三(Mutex)

    C# 中 Mutex 类也是用于线程同步操作的类,例如,当多个线程同时访问一个资源时保证一次只能有一个线程访问资源. 在 Mutex 类中,WaitOne() 方法用于等待资源被释放, Release ...

  10. 3_PHP表达式_5_数据类型转换_类型强制转换

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 3.5.2 类型强制转换 类型强制转换允许编程人员手动将变量的数据 ...