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. 字典树-HDOJ-1247-Hat’s Words

    Hat's Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  2. perftools查看堆外内存并解决hbase内存溢出

    最近线上运行的hbase发现分配了16g内存,但是实际使用了22g,堆外内存达到6g.感觉非常诡异.堆外内存用一般的工具很难查看,可以通过google-perftools来跟踪: http://cod ...

  3. 【BIEE】[nQSError: 35008]尝试从服务器检出对象时出错。请验证服务器设置。

    今天在使用PRD时,我先导入表A,然后觉得表A的名字不好,就把导入的表A重命名为表A_TMP,接着保存资料库就卡住了"未响应"(一般不会出现这种问题) 接着我直接使用任务管理器强制 ...

  4. 后期给项目加入Git版本控制

    一.为项目加上Git 1.进入对应文件夹 2.git init(初始化一个空的代码仓库) 3.git add .(将当前目录和子目录的文件标记为要添加到代码仓库) 4.git commit -m &q ...

  5. python单元测试框架 pyunit

    概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的放置位 ...

  6. 1 android 人脸识别

    1 https://www.google.com.hk/search?newwindow=1&safe=strict&q=android+%E5%9B%BE%E7%89%87%E4%B ...

  7. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  8. java比较字符串长度

    1.一种:str1.length()>=str.length():这种只比较字符串中的计算字符的数量,不管是中文还是英文 2:另一种:str1.getBytes().length>=str ...

  9. Gmail收不到邮件咋办?

    http://www.ipip.net/ping.php 分别输入 imap.gmail.com pop.gmail.com smtp.gmail.com 选择  国外 , 然后点ping,找到对应的 ...

  10. linux heads分析(转)

    内核默认的运行地址为PHY_OFFSET+0x8000,即物理地址开始后的0x8000字节处,前面是留给参数用的.参数以atag方式存储,默认放在0x100偏移位置. http://blog.chin ...