form组件 局部钩子和全局钩子
一丶FORM的介绍
2.对用户提交的数据进行校验
3.保留上次输入内容
二丶使用form组件实现注册功能
from django import forms # 导入forms组件
# 按照Django form组件的要求自己写一个类
class RegForm(forms.Form): # 继承Form
name = forms.CharField(label="用户名") # 在HTML就会生成一个文本框
pwd = forms.CharField(label="密码")
# 使用form组件实现注册方式
def register2(request):
form_obj = RegForm() # 实例化一个自定义form组件类的对象
if request.method == "POST":
# 实例化form对象的时候,把post提交过来的数据直接传进去
form_obj = RegForm(request.POST) # 自动html页面的数据以k:v形式传递给Form对象中
# 调用form_obj校验数据的方法
if form_obj.is_valid(): # is_valid() 是校验方法.错误信息是字典类型.有错误就是False
return HttpResponse("注册成功")
return render(request, "register2.html", {"form_obj": form_obj}) # 将form对象传递给前端
<body>
<form action="/reg2/" method="post" novalidate autocomplete="off"> <!-- -->
{% csrf_token %} <!--生成 CSRFTOKEN -->
<!--方式一: 通过传递的form对象, 获得每个属性. -->
{{ form_obj.name.label }} # name对象的lable属性
{{ form_obj.name }} # name对象
{{ form_obj.name.errors.0 }} # name对象的错误信息. errors是一个错误列表.取第一个错误即可
<div>
<label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}</label>
{{ form_obj.name }} {{ form_obj.name.errors.0 }}
</div>
<div>
<label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
{{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
</div>
<!-- 方式二 -->
{{form_obj.as_p}} # 展示所有的字段
<p>
{{form_obj.as_p}}
</p>
<div>
<input type="submit" class="btn btn-success" value="注册">
</div>
</form>
</body>
总结:
{{ form_obj.as_p }} # 展示所有的字段
{{ form_obj.user }} # input框
{{ form_obj.user.label }} # label标签的中文提示
{{ form_obj.user.id_for_label }} # input框的id
{{ form_obj.user.errors }} # 一个字段的错误信息
{{ form_obj.user.errors.0 }} # 一个字段的第一个错误信息
{{ form_obj.errors }} # 所有字段的错误
三丶FORM组件
常用字段与插件
### initial 默认值
class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三" # 设置默认值
)
### error_messages 重写错误信息
class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三",
error_messages={
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
}
)
### password 修改input文本框的类型为密码类型
# attrs 设置属性(可以添加bootstrap样式)
# render_value
class LoginForm(forms.Form):
pwd = forms.CharField(
min_length=6,
label="密码",
widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
)
### radioSelect 单radio值为字符串
class LoginForm(forms.Form):
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")), # 在python中是 可供选择.存数据库的值为数字,显示在页面上的是 男/女
label="性别",
initial=3,
widget=forms.widgets.RadioSelect() # 设置这个input框的类型是 radio
)
### 单选Select
class LoginForm(forms.Form):
hobby = forms.fields.ChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=3,
widget=forms.widgets.Select() # 设置显示的标签 select标签
)
### 多选Select
class LoginForm(forms.Form):
hobby = forms.fields.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=[1, 3],
widget=forms.widgets.SelectMultiple() # 设置 select标签的属性 multiple多选
)
### 单选checkbox
class LoginForm(forms.Form):
keep = forms.fields.ChoiceField(
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput() #input的类型是 CheckBox单选框
)
### 多选checkbox
class LoginForm(forms.Form):