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)