Django def clean()函数对表单中的数据进行验证操作

 更新时间:2020年07月09日 16:40:25   作者:Violet-Guo  
这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近写的资源策略管理,在ceilometer 中创建alarm时,name要求是不能重复的,所以在创建policy的时候,要对policy的name字段进行验证,而django中正好拥有强大的表单数据验证的功能。

#这是policy中的name字段,在表单的数据进行提交的时候,所有的数据流会经过clean()这个函数

name = forms.CharField(max_length=255, label=_("Name"))

#在clean函数中先取出表单中的name字段,在从数据库里面拿到所有的数据进行检查

  def clean(self):
    cleaned_data = super(CreatePolicyForm, self).clean()
    name = cleaned_data.get('name')

    try:
      policys = api.nova.policy_list(self.request)
    except:
      exceptions.handle(request,
               _('Unable to retrieve policys list.'))
    if policys is not None and name is not None:
      for policy in policys:
        if policy.name.lower() == name.lower():
          raise forms.ValidationError(
            _('The name "%s" is already used by another policy.')
            % name
          )
    return cleaned_data

补充知识:django中关于表单自定义验证器和常用验证器

常用验证器:

在验证某个字段的时候,可以传递一个 validators 参数用来指定验证器,进一步对数据进行过滤。验证器有很多,但是很多验证器我们其实已经通过这个 Field 或者一些参数就可以指定了。比如 EmailValidator ,我们可以通过 EmailField 来指定,比如 MaxValueValidator ,我们可以通过 max_value 参数来指定。

以下是一些常用的验证器:

1. MaxValueValidator :验证最大值。

2. MinValueValidator :验证最小值。

3. MinLengthValidator :验证最小长度。

4. MaxLengthValidator :验证最大长度。

5. EmailValidator :验证是否是邮箱格式。

6. URLValidator :验证是否是 URL 格式。

7. RegexValidator :如果还需要更加复杂的验证,那么我们可以通过正则表达式的验证

器: RegexValidator 。比如现在要验证手机号码是否合格,那么我们可以通过以下代码实

现:

class MyForm(forms.Form):

  telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])

自定义验证:

有时候对一个字段验证,不是一个长度,一个正则表达式能够写清楚的,还需要一些其他复杂的逻辑,那么我们可以对某个字段,进行自定义的验证。比如在注册的表单验证中,我们想要验证手机号码是否已经被注册过了,那么这时候就需要在数据库中进行判断才知道。对某个字段进行自定义的验证方式是,定义一个方法,这个方法的名字定义规则是: clean_fieldname 。如果验证失败,那么就抛出一个验证错误。比如要验证用户表中手机号码之前是否在数据库中存在,那么可以通过以下代码实现:

class MyForm(forms.Form):
  telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])
  def clean_telephone(self):
    telephone = self.cleaned_data.get('telephone')
    exists = User.objects.filter(telephone=telephone).exists()
    if exists:
      raise forms.ValidationError("手机号码已经存在!")
    else:
      return telephone

以上是对某个字段进行验证,如果验证数据的时候,需要针对多个字段进行验证,那么可以重写 clean 方法。比如要在注册的时候,要判断提交的两个密码是否相等。那么可以使用以下代码来完成:

class MyForm(forms.Form):
  telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])
  pwd1 = forms.CharField(max_length=12)
  pwd2 = forms.CharField(max_length=12)
  def clean(self):
    cleaned_data = super().clean()
    pwd1 = cleaned_data.get('pwd1')
    pwd2 = cleaned_data.get('pwd2')
    if pwd1 != pwd2:
      raise forms.ValidationError('两个密码不一致!')

提取错误信息:

如果验证失败了,那么有一些错误信息是我们需要传给前端的。这时候我们可以通过以下属性来获取:

1. form.errors :这个属性获取的错误信息是一个包含了 html 标签的错误信息。

2. form.errors.get_json_data() :这个方法获取到的是一个字典类型的错误信息。将某个字段的名字作为 key ,错误信息作为值的一个字典。

3. form.as_json() :这个方法是将 form.get_json_data() 返回的字典 dump 成 json 格式的字符串,方便进行传输。

4. 上述方法获取的字段的错误值,都是一个比较复杂的数据。比如以下:

{'username': [{'message': 'Enter a valid URL.', 'code': 'invalid'}, {'message': 'Ensurethis value has at most 4 characters (it has 22).', 'code': 'max_length'}]}

那么如果我只想把错误信息放在一个列表中,而不要再放在一个字典中。这时候我们可以定义一个方法,把这个数据重新整理一份。实例代码如下:

class MyForm(forms.Form):
  username = forms.URLField(max_length=4)
  def get_errors(self):
    errors = self.errors.get_json_data()
    new_errors = {}
    for key,message_dicts in errors.items():
      messages = []
      for message in message_dicts:
        messages.append(message['message'])
      new_errors[key] = messages
    return new_errors

这样就可以把某个字段所有的错误信息直接放在这个列表中。

以上这篇Django def clean()函数对表单中的数据进行验证操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Python进行AES加密和解密的示例代码

    使用Python进行AES加密和解密的示例代码

    这篇文章主要介绍了使用Python进行AES加密和解密的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Python结合WPS多维表实现在线批量查词功能

    Python结合WPS多维表实现在线批量查词功能

    Python是当前人工智能时代最受欢迎的编程语言,越来越多的应用程序把其整合到自身的功能当中,WPS多维表就是最早接入Python代码的应用平台,下面我们就来看看如何在多维表中应用Python代码实现批量单词查询吧
    2025-12-12
  • Python改变对象的字符串显示的方法

    Python改变对象的字符串显示的方法

    这篇文章主要介绍了Python改变对象的字符串显示的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • 使用TensorFlow搭建一个全连接神经网络教程

    使用TensorFlow搭建一个全连接神经网络教程

    今天小编就为大家分享一篇使用TensorFlow搭建一个全连接神经网络教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python机器学习GCN图卷积神经网络原理解析

    python机器学习GCN图卷积神经网络原理解析

    这篇文章主要为大家介绍了GCN图卷积神经网络原理及代码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 使用Python读写文本文件及编写简单的文本编辑器

    使用Python读写文本文件及编写简单的文本编辑器

    这篇文章主要介绍了使用Python读写文本文件及编写简单的文本编辑器的方法,可以利用简单的Python代码实现编辑器中的读取清空和文本文件的新建等操作,需要的朋友可以参考下
    2016-03-03
  • Python numpy.zero() 初始化矩阵实例

    Python numpy.zero() 初始化矩阵实例

    今天小编就为大家分享一篇Python numpy.zero() 初始化矩阵实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python使用Selenium抓取动态网页的方法步骤

    Python使用Selenium抓取动态网页的方法步骤

    在如今的网络中,许多网站是“动态”的,即网页内容不是静态的 HTML 文件,而是由 JavaScript 动态生成的,这种动态网页在数据抓取中带来了一些挑战,在本教程中,我们将详细介绍如何使用 Python 抓取动态网页,需要的朋友可以参考下
    2024-11-11
  • Python中按指定数量分割列表字符串的两种方法

    Python中按指定数量分割列表字符串的两种方法

    处理列表数据时,有时我们需要将一个包含长字符串的列表分割成按照特定长度的小字符串的多个列表,本文主要介绍了Python中按指定数量分割列表字符串,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • python+OpenCV实现图像拼接

    python+OpenCV实现图像拼接

    这篇文章主要为大家详细介绍了python+OpenCV实现图像拼接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论