Django的forms验证

forms验证的用途

	- 用户提交的信息认证
    - 错误信息反馈
    - 保留上一次提交的数据

自定义表单

from django import forms as Dforms
from django.forms import fields
from django.forms import widgets
class Detail_Forms(Dforms.Form):
    user = fields.CharField(widget=widgets.TextInput({'placeholder': '用户名'}))
    num = fields.IntegerField()
    place = fields.ChoiceField(choices=[(1, 'SH'), (2, 'BJ'), ])
    # CharField 表示字符串类型的字段,使用插件widget可以自定义各种标签
    # widgets.TextInput 为一个类
    # widgets.TextInput()为一个对象,可以传入参数,参数为字典类型,内容就是需要自定义的标签的属性

字段中的参数

    - required=True    是否不允许为空
    - widget=None   html插件
    - label=None    用于生成label标签或显示内容
    - initial=None    初始值
    - help_text=''    帮助信息(在标签旁边显示)
    - error_messages=None    错误信息({'required': '不能为空', 'invalid': '格式错误'}- show_hidden_initial=False    是否在当前插件后面再添加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一致)
    - validators=[]    自定义验证规则
    - disabled=False    是否可以编辑
    - label_suffix=None    label内容后缀

使用示例

	email = forms.CharField(
        label="Email",
        max_length=50,
        widget=forms.widgets.EmailInput(
            attrs={'class': 'form-control', 'style': "width: 60%;"}
        )
    )

在使用时可以直接复用Model,使用如下

	from .models import Comment
	class CommentForm(forms.ModelForm):
		class Meta:
	        model = Comment
	        fields = ['nickname', 'email', 'website', 'content']

直接配置model和fields就行了,但是如果要设置一些样式的话,还要额外定义各字段的组件。
验证前端传回的数据
在验证之前,应该先向前端发送自定义的form表单信息

obj = forms.Detail_Forms()
return render(request, 'Data_Form.html', {'oo': obj})
	models 验证
    验证模型字段 - Model.clean_fields()
    整体验证模型 - Model.clean()
    验证字段唯一性 - Model.validate_unique()
    调用full_clean()时,将执行上面这三个步骤,并按照顺序执行
    Model.clean_fields(exclude = None)  # 验证模型上的所有字段,可以使用exclude来排除一些字段
    Model.validate_unique(exclude = None)  # 验证模型上的所有字段的唯一约束,以使用exclude来排除一些字段

接下来就是接收前端传回的数据

obj = forms.Detail_Forms(request.POST)
# is_valid() 验证提交的内容是否满足要求,当全部满足的时候才会返回True,否则返回False
obj.is_valid() # 这一步是必须的,如果不验证就无法进行下一步的操作
# clean()获取验证通过的值,只要有通过的就可以返回 为字典类型
obj.clean()
# is_bound区分绑定与未绑定的信息
obj.is_bound
# errors 返回错误信息 为一个对象,内容类似html语言
obj.errors
# print(obj.errors.as_json()) 字符串类型
# print(obj.errors.as_data()) django数据类型

向前端发送错误信息

rep = {'status': True, 'error': None, 'data': None}
# 返回错误的第一种方式
error_obj = obj.errors.as_json()
rep['status'] = False
rep['error'] = error_obj
# 此方法前端需要两次反序列化
# 返回错误信息的第二种方式
error_obj = obj.errors.as_data() # 由于这个类型中包含django的ValidationError类型,需要做特殊的处理才能转为json类型
rep['status'] = False
rep['error'] = error_obj
json.dumps(error_obj, cls=JSON_to_another.JsonCustomEncoder) # 对于特殊数据不能序列化的按照cls对应的操作进行处理
# 此方法前端只需要一次反序列化

class JsonCustomEncoder(json.JSONEncoder):  # 处理函数,对特定数据类型进行处理
    def default(self, field):
        if isinstance(field, ValidationError):
            return {'code': field.code, 'message': field.message}  # 返回一个字典
        else:
            return json.JSONEncoder.default(self, field)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值