一.编写表单类
通过Django提供的Form类来生成表单
注意事项:- 提前导入forms模块:from django import forms
- 所有的表单类都要继承forms.Form类
- 每个表单字段都有自己的字段类型比如CharField,它们分别对应一种HTML语言中的元素中的表单元素。
- 字段中拥有不同的属性
from django import formsclass MyForm(forms.Form): name = forms.CharField(max_length=10,min_length=3,label='用户名') pwd = forms.CharField(max_length=10,min_length=3,label='密码') email = forms.CharField(label='邮箱')#使用时实例化产生一个对象,传入要校验的数据(字典)myform = MyForm(request.POST)
二.渲染模板
第一种方式:可扩展性最高
第二种方式:for循环form对象
第三种方式:可扩展性最差,不推荐使用
三.渲染错误信息
视图层
def register(request): if request.method=="POST": form=UserForm(request.POST) if form.is_valid(): print(form.cleaned_data) # 所有干净的字段以及对应的值 else: print(form.cleaned_data) # print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]} print(form.errors.get("name")) # ErrorList ["错误信息",] return render(request,"register.html",locals()) form=UserForm() return render(request,"register.html",locals())
模板层
四.field常用的属性
1.field.label 字段对应的label信息2.field.label_tag 自动生成字段的label标签,注意与{ { field.label }}的区别。3.field.value 当前字段的值,比如一个Email字段的值someone@example.com4.field.errors 包含错误信息的元素5.field.is_hidden 用于判断当前字段是否为隐藏的字段,如果是,返回True6.field.field 返回字段的参数列表。例如{ { char_field.field.max_length }}7.field.help_text 字段的帮助信息
五. 使用表单验证数据
- Form.clean()
如果你要自定义验证功能,那么你需要重新实现这个clean方法。
- Form.is_valid()
调用is_valid()
方法来执行绑定表单的数据验证工作,并返回一个表示数据是否合法的布尔值。
>>> data = {'subject': 'hello',... 'message': 'Hi there',... 'sender': 'foo@example.com',... 'cc_myself': True}>>> f = ContactForm(data)>>> f.is_valid()True
让我们试下非法的数据。下面的情形中,subject为空(默认所有字段都是必需的)且sender是一个不合法的邮件地址:
>>> data = {'subject': '',... 'message': 'Hi there',... 'sender': 'invalid email address',... 'cc_myself': True}>>> f = ContactForm(data)>>> f.is_valid()False
- Form.errors
表单的errors属性保存了错误信息字典:
>>> f.errors{'sender': ['Enter a valid email address.'], 'subject': ['This field is required.']}
在这个字典中,键为字段的名称,值为错误信息的Unicode字符串组成的列表。错误信息保存在列表中是因为字段可能有多个错误信息。
- Form.errors.as_data()
返回一个字典,它将字段映射到原始的ValidationError实例。
>>> f.errors.as_data(){'sender': [ValidationError(['Enter a valid email address.'])],'subject': [ValidationError(['This field is required.'])]}
- Form.errors.as_json(escape_html=False)
返回JSON序列化后的错误信息字典。
>>> f.errors.as_json(){"sender": [{"message": "Enter a valid email address.", "code": "invalid"}],"subject": [{"message": "This field is required.", "code": "required"}]}
- Form.add_error(field, error)
向表单特定字段添加错误信息。
field参数为字段的名称。如果值为None,error将作为Form.non_field_errors()
的一个非字段错误。
- Form.has_error(field, code=None)
判断某个字段是否具有指定code的错误。当code为None时,如果字段有任何错误它都将返回True。
- Form.non_field_errors()
返回Form.errors中不是与特定字段相关联的错误。
六.局部钩子
rom django.core.exceptions import NON_FIELD_ERRORS, ValidationErrordef clean_name(self): val=self.cleaned_data.get("name") ret=UserInfo.objects.filter(name=val) if not ret: return val else: raise ValidationError("该用户已注册!")def clean_tel(self): val=self.cleaned_data.get("tel") if len(val)==11: return val else: raise ValidationError("手机号格式错误")
七.全局钩子
def clean(self): pwd=self.cleaned_data.get('pwd') r_pwd=self.cleaned_data.get('r_pwd') if pwd and r_pwd: if pwd==r_pwd: return self.cleaned_data else: raise ValidationError('两次密码不一致') else: return self.cleaned_data