form组件
from django import forms
from django.forms import widgets
class LoginForm(forms.Form):
username = forms.CharField(min_length=5,max_length=12
, error_messages={"required": "该字段不能为空"
,"min_length": "最少输入值"
, "invalid": "格式错误"} # 设置页面上的信息
) # -->最小长度,最大长度
password = forms.CharField(
widget=widgets.PasswordInput(attrs={"class": "xxx"}) # 设置input标签的type类型
# attrs设置input标签的属性
)
hobby = forms.CharField(
widget=widgets.Select(choices=(("value","标签的文本"),("value","标签的文本"))) # choices放元组
)
login_form = LoginForm() # --> 实例化一个对象
传递到HTML页面中去
{{login_form.username}} 渲染一个input标签
{{login_form.password}}
form_msg = LoginForm(request.POST) -->把前端的数据传递到类中,自动做校验,把数据传到对应的字段中去
form_msg.is_valid() --> 自动做校验,返回True的时候,表示符合数据形式,去数据库做校验
form_msg.cleaned_data={} --> 放符合的数据
去数据库做校验
errors = form_msg.errors={"key":["error1","error2"]} --> 放不符合的数据
把errors传到前端去,显示错误信息 ---> errors.username.0 (显示第一个错误信息)
未绑定的forms对象,没有数据
绑定的forms对象,有数据
form组件的钩子:自己设定一些规则,去校验数据
引入:from django.core.exceptions import ValidationError
局部钩子
def clean_user(self): 命名要clean_ + "要判断的字段名"
if not self.clean_data.get("user").isdigit(): --> 判断是否为纯数字
return self.clean_data.get("user").isdigit()
else:
raise ValidationError("错误信息") --> 不符合验证的时候,就返回error_messages中,页面上再去渲染
全局钩子
def clean(self):
# 重写父类方法,定义全局钩子
# 等所有的值都通过验证赋值之后,再判断
return self.cleaned_data