Django提供了3中方式来验证表单

官网文档:https://docs.djangoproject.com/en/1.9/ref/validators

1.表单字段验证器
  a.引入:from django.core.exceptions import ValidationError
  b.定义验证方法,验证不通过抛一个ValidationError异常

    def validate_name(value):
      验证不通过
        raise ValidationError("%s的信息已经存在"%value)
      验证通过
        pass

  c.在Form中定义字段时候,通过validators指定验证器
    name = forms.CharField(label="名称", validators=[validate_name])
例子:

from django import forms
from hello.models import Publisher
from django.core.exceptions import ValidationError def validate_name(value):
if value == "xiaol":
raise ValidationError("%s的信息已经存在" % value)
else:
pass class PublisherForm(forms.ModelForm):
name = forms.CharField(label="名称", validators=[validate_name])
class Meta:
model = Publisher
exclude = ("id",)

2.clean_filedName,针对某个字段进行验证
  a.在ModelForm中定义clean_filedName实例方法

  b.这里如果验证不通过抛异常

  c.如果验证通过需要把值在return出去,否则表单就获取不到这个值了
    def clean_name(self):
      value = self.cleaned_data.get('name')
      验证不通过
        raise ValidationError("%s的信息已经存在"%value)
      验证通过
        return value

例子:

from django import forms
from hello.models import Publisher
from django.core.exceptions import ValidationError class PublisherForm(forms.ModelForm):
def clean_name(self):
value = self.cleaned_data.get('name')
if value == "xiaol":
raise ValidationError("%s的信息已经存在" % value)
else:
return value
class Meta:
model = Publisher
exclude = ("id",)

3.表单clean方法,针对整个表单验证(比如确认密码这样的需求)
  a.在ModelForm中定义clean实例方法,
  b.这里是对整个表单进行验证,所以取值的时候就不能像clean_filedName那样取
  c.需要先调用父类的clean方法,把表单的值保存到本地变量中,在从本地变量中取想要的值
  d.和clean_filedName一样,这里验证通过也需要返回,但是这里返回的不是一个值,而是通过父类方法获取到的那个本地变量
  e.和clean_filedName不同,这里验证不通过不是抛异常,而是通过 self._errors['字段名']=self.error_class(["提示信息"])的方式返回
    def clean(self):
      cleaned_data = super(XXXModelForm,self).clean()
      value = cleaned_data.get('name')
      验证不通过
        self._errors['name']=self.error_class(["%s的信息已经存在" % value])
      验证通过
        return cleaned_data

例子:

from django import forms
from hello.models import Publisher class PublisherForm(forms.ModelForm):
def clean(self):
cleaned_data = super(PublisherForm, self).clean()
value = cleaned_data.get('name')
if value == "xiaol":
self._errors['name'] = self.error_class(["%s的信息已经存在" % value])
else:
return cleaned_data
class Meta:
model = Publisher
exclude = ("id",)

备注:如果clean_fieldName和clean都定义了,那么两个都会执行,顺序是:clean_fieldName->clean

17.Django表单验证的更多相关文章

  1. Python菜鸟之路:Django 表单验证

    前言 Django中完成表单验证,常用的有两种方法: 一种是通过HTML + JS + Ajax实现. 另一种是通过Django自身的forms模块来生成相应个HTML标签来完成表单验证.这是本节着重 ...

  2. django 表单验证和字段验证

    表单验证和字段验证 表单验证发生在数据验证之后.如果你需要自定义这个过程,有几个不同的地方可以修改,每个地方的目的不一样.表单处理过程中要运行三种类别的验证方法.它们通常在你调用表单的is_valid ...

  3. django表单验证和跨站伪造csrf

    Form验证 django中的Form一般有两种功能: 输入html 验证用户输入 django使用内置form方法验证表单提交的数据 html页面 <!DOCTYPE html> < ...

  4. Django表单验证

    从前端提交的各种数据可能存缺少必要字段以及包含非法数据等问题, 并且通常需要进行类型转换后才可以交由业务逻辑处理. 我们当然可以在控制器(Django的views函数)中完成这些工作, 但是这样会使控 ...

  5. Django-website 程序案例系列-17 forms表单验证的字段解释

    1.Django内置字段如下: Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial ...

  6. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  7. angular学习笔记(二十)-表单验证

    本篇主要介绍angular中的表单验证: 表单验证主要有以下一些内容: 1. required指令: 相当于html5的required属性,验证不能为空 2. ng-maxlength属性: 验证内 ...

  8. Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)

    通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...

  9. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

随机推荐

  1. Android Scroll具体解释(二):OverScroller实战

    作者: ztelur 联系方式:segmentfault,csdn.github 本文仅供个人学习,不用于不论什么形式商业目的,转载请注明原作者.文章来源.链接,版权归原文作者全部.  本文是andr ...

  2. AndroidStudio快捷键大全

    很多近期学习移动开发的朋友都是通过Eclipse集成ADT开发安卓程序.但是谷歌已经推出了自己的亲儿子--Android Studio.可以说比原来的开发工具强大很多,现在各大公司也已经逐渐淘汰了Ec ...

  3. ARM指令中的函数调用

    1. 重要寄存器 SP 栈指针,  每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来 ...

  4. Tomcat、Weblogic、JBoss、GlassFish、Resin、Websphere弱口令及拿webshell方法总结 [复制链接]

    1.java应用服务器    Java应用服务器主要为应用程序提供运行环境,为组件提供服务.Java 的应用服务器很多,从功能上分为两类:JSP 服务器和 Java EE 服务器.1.1  常见的Se ...

  5. DNS 取得授权

    1.阿里云上cnroot.cn申请DNS解析服务器 也就是cnroot.cn下的子域名都从这个DNS上获取. 如www.cnroot.cn 如 handle.cnroot.cn 2.vi /home/ ...

  6. Url Scheme实现APP间通信、分享

    代码地址如下:http://www.demodashi.com/demo/12748.html 简介: URL Scheme就是一个可以让app相互之间可以跳转的对外接口.通过给APP定义一个唯一的U ...

  7. Mysql的建表规范与注意事项

    一. 表设计规范 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储 ...

  8. 【海盗派测试分析MFQ&PPDCS】读书笔记

    使用脑图花了一张读书笔记,可能有点长

  9. linux vi设置行号

    首先,vi的配置文件是/etc/vim/vimrc,不同系统可能有出入,不过我建议大家在home中建立一个.vimrc文件,照样可以达到同样的效果.其实/etc中的配置是全局的,home中的配置只针对 ...

  10. Delphi Math里的基本函数,以及浮点数比较函数

    Delphi里的好东西太多,多到让人觉得烦.这种感觉就是当年打游戏<英雄无敌3>,改了钱以后,有钱了每天都要造建筑,明明是好事,可是让人觉得烦. 先记录下来,以后再回来加强对Math单元的 ...