forms组件
forms组件
【一】介绍
- Forms组件是用来处理用户提交的数据,并将其转换成Python可处理的数据类型。Forms组件提供了一种简单的方式来定义表单的结构以及验证用户输入的数据。通过使用Forms组件,你可以有效地处理用户输入的数据,包括验证、转换以及显示错误信息。
【二】基本使用
from django import forms
class MyForm(forms.Form):
username = forms.CharField(max_length=8,min_length=3)
password = forms.CharField(max_length=8,min_length=3)
email = forms.EmailField()
【三】校验数据
- 先实例化一个对象
form_obj = MyForm()
- 将待校验的数据组织成字典的形式传入
form_obj = MyForm({'username':'qcc','password':'123','email':'123'})
【1】校验数据是否合法
.is_valid()
校验数据是否合法- 只有在所有的数据全部合法的情况下才会返回True
form_obj.is_valid() # False 因为邮箱的格式不正确
【2】查看所有校验通过的数据
cleaned_data
查看所有校验通过的数据- 必须配合
.is_valid()
一起使用,否则会报错
form_obj.cleaned_data
# {'username': 'qcc', 'password': '123'}
【3】查看未校验通过的数据
errors
查看所有不符合校验规则以及不符合的原因
form_obj.errors
# <ul class="errorlist"><li>email<ul class="errorlist"><li>Enter a valid email address.</li></ul></li></ul>
【四】渲染到前端
- forms组件只会自动帮你渲染获取用户输入的标签
from django import forms
class MyForm(forms.Form):
username = forms.CharField(max_length=8,min_length=3,label='用户名')
password = forms.CharField(max_length=8,min_length=3)
email = forms.EmailField()
def index(request):
form_test = MyForm()
return render(request, 'index.html',locals())
【1】第一种渲染方式
- 实例化对象
.as_p
as_ul
as_table
- 代码书写极少 封装程度太高 不利于后期扩展 一般只在本地测试使用
<body>
{{ form_test.as_p }}
</body>
<body>
{{ form_test.as_ul }}
</body>
<body>
{{ form_test.as_table }}
</body>
【2】第二种渲染方式
- 可扩展性很强 但是书写的代码太多
<body>
{{ form_test.username.label }} {{ form_test.username }}
</body>
【3】第三种渲染方式
- 代码书写简单 并且扩展性也高
<body>
{% for form in form_test %}
<p>{{ form.label }}:{{ form }}</p>
{% endfor %}
</body>
【五】forms组件展示错误信息
- 让浏览器不校验
novalidate
<form action="" method="post" novalidate>
def index(request):
form_test = MyForm()
if request.method =='POST':
form_test = MyForm(request.POST)
if form_test.is_valid():
return HttpResponse('ok')
return render(request, 'index.html',locals())
<form action="" method="post" novalidate>
{% for form in form_test %}
<p>
{{ form.label }}:{{ form }}
<span style="color: red"> {{ form.errors.0 }}</span>
</p>
{% endfor %}
<input type="submit" class="btn btn-info">
</form>
- 必备的条件:get请求和post传给html页面对象变量名必须一样
- forms组件当你的数据不合法的情况下,会保存上一次的数据,可以基于之前的结果进行修改
【1】自定制错误信息
required
- 如果输入为空 提示的信息
invalid
- 邮箱输入错误提示的信息
class MyForm(forms.Form):
username = forms.CharField(max_length=6, min_length=3, label='用户名',
error_messages={
'required': '用户名不能为空',
'max_length': '用户名长度不能超过6个字符',
'min_length': '用户名长度不能少于3个字符'
})
password = forms.CharField(max_length=6, min_length=3, label='密码',
error_messages={
'required': '密码不能为空',
'max_length': '密码长度不能超过6个字符',
'min_length': '密码长度不能少于3个字符'
})
email = forms.EmailField(
error_messages={
'required': '邮箱不能为空',
'invalid': '邮箱格式不正确'
}
)
【六】钩子函数hook
-
在特定的节点自动触发完成响应操作
-
钩子函数在forms组件中就类似于第二道关卡,能够自定义校验规则
-
有两类钩子
- 局部钩子
- 全局钩子
【1】局部钩子
局部钩子
当需要给单个字段增加校验规则的时候使用
class MyForm(forms.Form):
username = forms.CharField(max_length=6, min_length=3, label='用户名',
error_messages={
'required': '用户名不能为空',
'max_length': '用户名长度不能超过8个字符',
'min_length': '用户名长度不能少于3个字符'
})
def clean_username(self):
username = self.cleaned_data.get('username')
if '666' in username:
# 提示前端展示错误信息
# 前面放的是需要给展示的字段名,后面放的是错误信息
self.add_error('username', '用户名中不能包含666')
return username
【2】全局钩子
全局钩子
当需要给多个字段增加校验规则的时候使用
class MyForm(forms.Form):
password = forms.CharField(max_length=6, min_length=3, label='密码',
error_messages={
'required': '密码不能为空',
'max_length': '密码长度不能超过6个字符',
'min_length': '密码长度不能少于3个字符'
})
confirm_password = forms.CharField(max_length=6, min_length=3, label='确认密码',
error_messages={
'required': '确认密码不能为空',
'max_length': '确认密码长度不能超过6个字符',
'min_length': '确认密码长度不能少于3个字符'
})
def clean(self):
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if password != confirm_password:
self.add_error('confirm_password', '两次密码不一致')
# 将钩子函数钩出来的数据再放回去
return self.cleaned_data
【七】forms组件其他参数及补充知识点
【1】label
命名
name = forms.CharField(label='昵称')
【2】error_messages
自定义报错信息
email = forms.EmailField(
error_messages={
'required': '邮箱不能为空',
'invalid': '邮箱格式不正确'
}
)
【3】 initial
默认值
name = forms.CharField(initial='qcc')
【4】 required
控制是否必填
name = forms.CharField(required=False)
【5】widget
控制type类型
widget=forms.widgets.TextInput()
widget=forms.widgets.PasswordInput()
widget=forms.widgets.EmailInput()
# widget加样式(多个属性值的话 直接空格隔开)
widget=forms.widgets.TextInput(attrs={'class':'form-control c1 c2','username':'qcc'})
【6】 validators
正则校验
validators=[
RegexValidator(r'^【0-9]+$','请输入数字'),
RegexValidator(r'^158[0-9]+$','数字必须以158开头'),
]
【7】radio
单选
gender = forms.ChoiceField(
choices=((1, '男'), (2, '女'), (3, '保密')),
label='性别',
initial=3,
widget=forms.widgets.RadioSelect()
)
【8】select
选择下拉框
hobby = forms.ChoiceField(
choices=((1, '篮球'), (2, '足球'), (3, '乒乓球')),
label='爱好',
initial=3,
widget=forms.widgets.Select()
)
【9】select
多选下拉框
hobby = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "乒乓球"), ),
label="爱好",
initial=[1, 3],
widget=forms.widgets.SelectMultiple()
)
【10】checkbox
单选框
keep = forms.ChoiceField(
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput()
)
【11】checkbox
多选框
hobby = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "乒乓球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple()
)