一.编写表单类
通过Django提供的Form类来生成表单
注意事项:
- 提前导入forms模块:from django import forms
- 所有的表单类都要继承forms.Form类
- 每个表单字段都有自己的字段类型比如CharField,它们分别对应一种HTML语言中的
- 字段中拥有不同的属性
from django import forms
class 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)
二.渲染模板
第一种方式:可扩展性最高
<form action="" method="post" >
<p>用户名: {{ myform.name }}</p>
<p>密码: {{ myform.pwd }}</p>
<p>邮箱: {{ myform.email }}</p>
<input type="submit" value="提交">
</form>
第二种方式:for循环form对象
<form action="" method="post" >
{% for foo in myform %}
<p>{{ foo.label }}:{{ foo }}</p>
{% endfor %}
<input type="submit" value="提交">
</form>
第三种方式:可扩展性最差,不推荐使用
<form action="" method="post" >
{#{{ myform.as_p }}#}
{{ myform.as_ul }}
<input type="submit" value="提交">
</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())
模板层
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" class="btn btn-default">
</form>
四.field常用的属性
1.field.label 字段对应的label信息
2.field.label_tag 自动生成字段的label标签,注意与{{ field.label }}的区别。
3.field.value 当前字段的值,比如一个Email字段的值someone@example.com
4.field.errors 包含错误信息的元素
5.field.is_hidden 用于判断当前字段是否为隐藏的字段,如果是,返回True
6.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, ValidationError
def 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