Django之Form组件
一、Form组件介绍
Form组件主要的功能如下:
- 生成前端页面能用的HTML标签(渲染页面)
- 对用户提交的数据进行校验(校验数据)
- 把数据的校验结果展示到前端页面(展示错误信息)
- 输入框保留用户上次输入的数据(保留数据)
二、Form组件的使用
在Django项目中通常情况下我们会在需要使用Form组件的app下新建一forms.py文件,然后在该文件下书写内容.
示例:
# app下的forms.py
from django import forms
# 自定义一个类继承forms.Form
class RegisterForm(forms.Form):
username = forms.CharField(min_length=3, max_length=11)
password = forms.CharField(min_length=6, max_length=11)
校验数据:
# Python console
from app01 import views
# 1.给自定义的类传一个字典
obj=views.MyRegForm({'username':'jason','password':'12','email':'123'})
# 2.判断数据是否全部合法
obj.is_valid() # 只有数据全部符合要求才会是True
Out[4]: False
# 3.查看符合校验规则的数据
obj.cleaned_data
Out[5]: {'username': 'jason'}
# 4.查看不符合条件的数据以及不符合的原因是什么
obj.errors
Out[6]: {
'password': ['Ensure this value has at least 3 characters (it has 2).'],
'email': ['Enter a valid email address.']
}
# 5.校验数据的时候 默认情况下类里面所有的字段都必须传值
obj = views.MyRegForm({'username':'jason','password':'123'})
obj.is_valid()
Out[12]: False
obj.errors
Out[13]: {'email': ['This field is required.']}
# 6.默认情况下可以多传 但是绝对不能少传
obj=views.MyRegForm({'username':'jason','password':'1233','email':'[email protected]','xxx':'ooo'})
obj.is_valid()
Out[15]: True
渲染页面:
# forms组件指挥帮你渲染获取用户输入(输入,选择,下拉框...)的标签,提交按钮需要自己写
<p>三种渲染前端页面的方式</p>
<p>第一种渲染前端页面的方式:封装程度太高了 标签样式及参数不方便调整 可扩展性差(不推荐使用)
{{ form_obj.as_p }}
{{ form_obj.as_ul }}
</p>
<p>第二种渲染页面的方式:扩展性较高 不足之处在于 需要你手写的代码量比较多(不推荐使用)</p>
<p>
{{ form_obj.username.label }}{{ form_obj.username }}
</p>
<p>
{{ form_obj.password.label }}{{ form_obj.password }}
</p>
<p>
{{ form_obj.email.label }}{{ form_obj.email }}
</p>
<p>第三种渲染前端页面的方式:代码量和扩展性都很高(推荐使用)</p>
{% for foo in form_obj %}
<p>{{ foo.label }}{{ foo }}</p>
{% endfor %}
如何展示错误信息
如何取消前端帮我们做的校验 form表单中添加一个参数即可
展示错误信息 用对象点errors.0
<form action="" method="post" novalidate>
{% for foo in form_obj %}
<p>
{{ foo.label }}:{{ foo }}
<span style="color: red">{{ foo.errors.0 }}</span>
</p>
{% endfor %}
<input type="submit">
</form>
自定义错误信息:
# app下forms.py
class RegisterForm(forms.Form):
username = forms.CharField(min_length=3, max_length=11, lable='用户名',
error_messages={
'min_length': '用户名不能少于三位',
'required': '用户名不能为空'
}
)
email = forms.EmailField(lable='邮箱', error_messages={
'required': '邮箱不能为空',
'invalid': '邮箱格式不正确',
})
Form组件钩子函数:
当你针对某些字段,还需要做一些额外的校验(eg:验证用户名是否含有非法字符)的时候,就需要用到钩子函数.
- 局部钩子:针对单个字段的校验,使用局部钩子(eg:验证手机号是否合法)
- 全局钩子:针对多个字段的校验,使用全局钩子(eg:验证注册时两次密码是否一致)
# app下forms.py
class RegisterForm(forms.Form):
username = ...
password = ...
re_password = ...
# 局部钩子:验证用户名中是否含有傻逼字段
def clean_username(self): # 固定写法clean_字段名
username = self.cleaned_data.get('username')
if '傻逼' in username:
# 给username字段添加错误信息
self.add_error('username', '用户名不合法')
return username
# 全局钩子:验证两次密码是否一致
def clean(self): # 固定写法clean
password = self.cleaned_data.get('password')
re_password = self.cleaned_data.get('re_password')
if password != re_password:
self.add_error('re_password', '两次密码不一致')
return self.cleaned_data
修改input框的type属性值
# app下forms.py
from django import forms
class RegisterForm(forms.Form):
username = froms.CharField(widget=forms.widgets.TextInput())
password = froms.CharField(widget=forms.widgets.PasswordInput())
re_password = ...
为input框添加类属性
# app下forms.py
from django import forms
class RegisterForm(forms.Form):
username = froms.CharField(widget=forms.widgets.TextInput(
attrs={
'class': 'form-control'
}
))
password = ...
re_password = ...
forms字段还支持正则校验
# app下forms.py
from django import forms
from django.forms import Form
from django.core.validators import RegexValidator
class MyForm(Form):
user = forms.CharField(
validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
)