ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django ModelForm 校验数据格式

2019-03-02 12:50:47  阅读:427  来源: 互联网

标签:ValidationError required Django forms length 为空 error 数据格式 ModelForm


发现ModelForm很好用,用来做form表单验证效果很好。但是也要注意几点。

forms的用法:

  •   使用默认方式:继承forms.Form类,类里面的字段名称一定要和前端HTML里面的form表单里面的name属性一致,当前端数据提交时,通过views视图里面的is_valid()方法自动验证数据是否格式正确。
    class RegisterForm(forms.Form):
        user = forms.CharField(min_length=6,
                                      max_length=20,
                                      error_messages={'required': '用户名不能为空.', 'min_length': "用户名长度不能小于6个字符", 'max_length': "用户名长度不能大于20个字符"}
    )
        pwd=forms.CharField(min_length=8,error_messages={'required': '密码不能为空.', 'min_length': "用户名长度不能小于6个字符"})
        email=forms.EmailField(error_messages={'required': '邮箱不能为空.'})

     

  •   使用自定义方法:自定义校验方式,定义一个以clean_开头的方法,后面加上需要校验的的字段,注意需要使用一个异常ValidationError 

    

from django.core.exceptions import ValidationError
 checkCode = fields.CharField(
        error_messages={'required': '验证码不能为空.'}
    )
# 自定义验证方法
    # 在需要自定义的字段前面加上clean_

    def clean_checkCode(self):
        if self.request.session.get('CheckCode').upper() != self.request.POST.get('checkCode').upper():
            raise ValidationError(message='验证码错误', code='invalid')

 

如果需要应用request请求,那么可以另外继承一个类,以便引入request

from django import forms
from django.forms import fields
from django.core.exceptions import ValidationError


class BaseForm(object):
    def __init__(self, request, *args, **kwargs):
        self.request = request
        super(BaseForm, self).__init__(*args, **kwargs)


class Register(BaseForm, forms.Form):

    account = fields.RegexField('[a-zA-Z]+[0-9]{0,32}',
                               min_length=8,
                               max_length=32,
                               error_messages={r'required': '不能为空', 'invalid': '以字母开头,包含字母,数字',
                                               'max_length': '不能大于32位', r'min_length': '不能小于8位'})
    password = fields.RegexField(
        '^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$\%\^\&\*\(\)])[0-9a-zA-Z!@#$\%\^\&\*\(\)]{3,32}$',
        min_length=3,
        max_length=32,
        error_messages={'required': '密码不能为空.', 'invalid': '密码必须包含数字,字母、特殊字符', 'min_length': "密码长度不能小于3个字符",
                        'max_length': "密码长度不能大于32个字符"}
    )
    email = fields.EmailField(error_messages={
        'required': '邮箱不能为空',
        'invalid': '邮箱格式不正确'
    })
    checkCode = fields.CharField(
        error_messages={'required': '验证码不能为空.'}
    )
# 自定义验证方法
    # 在需要自定义的字段前面加上clean_

    def clean_checkCode(self):
        if self.request.session.get('CheckCode').upper() != self.request.POST.get('checkCode').upper():
            raise ValidationError(message='验证码错误', code='invalid')

如何校验数据呢

  使用forms.Form的子类(就是刚才你建立的),将前端请求的数据当做参数创建对象,当对象调用is_valid()方法时,它将自动校验同名的数据。

clean():是获取验证通过的字段的方法。

error是获取验证失败的字段的失败信息:

  error.as_json():将信息转化成json格式的字符串 例如:(

{"account": [{"message": "\u4e0d\u80fd\u4e3a\u7a7a", "code": "required"}], "password": [{"message": "\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a.", "code": "required"}], "email":[{"message": "\u90ae\u7bb1\u4e0d\u80fd\u4e3a\u7a7a", "code": "required"}], "checkCode": [{"message": "\u9a8c\u8bc1\u7801\u4e0d\u80fd\u4e3a\u7a7a.", code": "required"}]})

  error.as_data():获取失败信息,不过其中是ValidationError对象  例如:({'account': [ValidationError(['不能为空'])], 'password':[ValidationError(['密码不能为空.'])], 'email': [ValidationError(['邮箱不能为空'])], 'checkCode': [ValidationError(['验证码不能为空.'])]}

  error.as_text():获取信息内容: 例如:(

* account
* 不能为空
* password
* 密码不能为空.
* email
* 邮箱不能为空
* checkCode
* 验证码不能为空.

但是如何获取json字符串勒

  那就是使用as_json(),他获取json格式的字符串,可以使用json.loads()变成json()格式,在前端解析的时候使用JSON.parse()方法获取内容,同事还能够避免编码的问题

标签:ValidationError,required,Django,forms,length,为空,error,数据格式,ModelForm
来源: https://www.cnblogs.com/wbdream/p/10460553.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有