form组件前戏
"""
练习
页面上获取用户输入的用户名和密码
然后判断用户名和密码是否符合一些条件 如果不符合则返回相应的提示信息
"""
自定义数据校验功能 主要步骤
1.搭建前端页面 标签渲染
2.校验数据是否合法 数据校验
3.返回相应的提示信息 提示信息
form组件基本定义
class MyForm(forms.Form):
username = forms.CharField(min_length=3, max_length=8)
password = forms.CharField(min_length=3, max_length=8)
email = forms.EmailField()
form组件数据校验功能
obj = views.MyForm({'username':'jason',
'password':'123',
'email':'123@qq.com'
})
obj.is_valid()
obj.cleaned_data
obj.errors
"""
1.在传递数据的时候 如果多传了额外字段 没有关系 form不校验
2.form组件内部定义的字段数据 默认都是必填的
可以通过修改参数required=False来控制是否必填
"""
form组件渲染标签
def my_form(request):
obj = MyForm()
return render(request,'my_form.html',locals())
"""
自动渲染的标签文本名称默认采用字段名首字母大写的形式
可以通过label参数自定义名称
form只渲染获取用户数据的标签 不渲染提交按钮 需要我们自己编写
"""
{{ obj.as_p }}
{{ obj.as_ul }}
{{ obj.as_table }}
<label for="{{ obj.username.id_for_label }}">{{ obj.username.label }}</label>
{{ obj.username }}
{% for foo in obj %}
<p>
<label for="{{ foo.id_for_label }}">{{ foo.label }}</label>
{{ foo }}
</p>
{% endfor %}
form组件提示信息
<form ... novalidate></form>
{{ foo.errors.0 }}
error_messages={
'min_length': '用户名最少3位',
'max_length': '用户名最大8位',
'required': '用户名不能为空',
'invalid':'邮箱格式不正确'
}
数据校验进阶
from django.core.validators import RegexValidator
class MyForm(Form):
user = fields.CharField(
validators=[
RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
)
def clean_username(self):
username = self.cleaned_data.get('username')
if username == 'jason':
self.add_error('username', '用户名已存在')
return username
def clean(self):
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if not password == confirm_password:
self.add_error('confirm_password', '两次密码不一致')
return self.cleaned_data
form组件补充
label 字段名称
required 是否必填
initial 默认值
error_messages 自定义错误信息
widget=forms.widgets.PasswordInput()
既可以修改input框的type类型
还可以操作标签的属性
form组件源码探索
"""阅读源码是提升编程思维的最佳方式!!!"""
obj.is_valid()