Django进阶–表单-初识
1. 简介
form表单中的数据流动于前后端,需要验证数据的合法性。Django提供了form表单功能用于验证数据合法性和创建html代码。
form表单功能类似于数据库的模型功能,可看作一个中间件。
2. 创建
2.1 创建模块
在app目录下创建forms.py
模块.
-practise
-practise
-book
-forms.py
-urls.py
......
2.2 自定义表单类
class RegisterForm(forms.Form):
uname = forms.CharField(max_length=20, min_length=6, label='用户名')
password = forms.CharField(max_length=8, min_length=6,
widget=forms.PasswordInput(attrs={'placeholder': '请输入密码'}),
error_messages={'min_length': '密码长度小于6',
'max_length': '密码长度超过8'
},
label='密码',
)
password_repeat = forms.CharField(widget=forms.PasswordInput(), label='确认密码')
email = forms.EmailField(label='邮件', required = False)
- 表单是通过类实现的,继承自forms.Form,然后在里面定义要验证的字段**.**
- 虽然form可以生成前端页面,但这个功能实际用的少,主要是是用form表单的验证功能
- max_length : 最大长度
- widget : 负责渲染网页上的表单,用于设置样式等
- attrs:包含渲染后的Widget 将要设置的HTML 属性
- error_messages:报错信息
- required:为False表示允许为空
3. 使用
3.1 视图函数调用
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST) #将RegisterForm类生成实例,传入模板渲染前端页面
if form.is_valid():
password = form.cleaned_data.get('password')
password_repeat = form.cleaned_data.get('password_repeat')
if password == password_repeat:
return HttpResponse('注册成功')
form = RegisterForm()
return render(request, 'book/register.html', {'form': form})
- 生成表单类实例,传递给前端
- is_valid()方法:验证提交数据的合法性。如果所有字段都包含有效数据,则将表单的数据放在
self.cleaned_data
属性中 - cleaned_data: 返回字典,里面包含通过验证后的正确数据。
3.2 前端调用
<form action="" method="post">
{% csrf_token %}
{{ form.as_ul }}
<input type="submit" value="提交">
</form>
- form类只能渲染内容,具体的骨架(form标签及三元素)及提交按钮,需要自定义。
- csrf_token:防止csrf(跨站请求伪造)攻击。
- as_ul:将每个元素渲染在ul标签额内。
4 Form属性及方法
4.1 form. is_bound
该属性表示Form
对象是否绑定数据(即form对象中各个字段是否获取到了值)
- 若未绑定则返回False,前端渲染出来的是一个未填写内容的表单(每个控件都没有值)
- 若已绑定则返回True,前端渲染出来的是一个已填写内容的表单(每个控件都没有值),且后端可以获取到值。
form = RegisterForm(request.POST)
[in]: form.is_bound
[out]: True
[in]: form.cleaned_data
[out]:
'email' (140292802976152) = {str} '1@qq.com'
'password' (140292802428144) = {str} 'qweqwe'
'password_repeat' (140292701581232) = {str} 'qweqwe'
'uname' (140292827209656) = {str} 'qqqqqq'
__len__ = {int} 4
请注意,传递空字典会创建包含空数据的绑定表单:
>>> f = ContactForm({})
>>> f.is_bound
True
4.2 Form.is_valid()
is_valid()方法运行验证并返回数据是否有效,有效则返回True,反之False.
取上个例子中的form
对象
# form = RegisterForm(request.POST)
>>form.is_valid()
>>True
4.3 Form.errors
该属性返回字典,里面包含验证后的错误信息。字典中,键是字段名称,值是表示错误消息的字符串列表。
#发送一次错误请求, 表单有做验证password 和 password_repeat必须一致
[in]:form.data
[out]:
'uname' (140292691724584) = {str} 'qqqqqq'
'password' (140292691230128) = {str} '123qwe'
'password_repeat' (140292691229616) = {str} 'qwe123'
'email' (140292691723800) = {str} '1@qq.com'
[in]:form.errors.get('password_repeat')
[out]:<class 'list'>: [ValidationError(['密码不一致'])] #即['密码不一致']
4.4 Form.fields
返回类字典对象,包含各个字段的对象
[in] form.fields
[out]
'uname' (140292827209656) = {CharField} <django.forms.fields.CharField object at 0x7f98700d4f28>
'password' (140292802428144) = {CharField} <django.forms.fields.CharField object at 0x7f98700d4a20>
'password_repeat' (140292701581232) = {CharField} <django.forms.fields.CharField object at 0x7f98700d47b8>
'email' (140292802976152) = {EmailField} <django.forms.fields.EmailField object at 0x7f98700d45f8>