Form组件、auth认证组件、自定义图片验证码登录、 自定义分页
12.7 Form组件
Django form组件实现的功能:生成页面可用的HTML标签、对用户提交的数据进行校验、保留上次输入内容
12.71 使用form组件实现注册功能
views.py:
# 按照Django form组件的要求写一个类
from django import forms
from django.forms import fields
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
# 自定义验证规则
def passward_validate(value):
mobile_re = re.compile(r"^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$")
if not mobile_re.match(value):
raise ValidationError("手机号码格式错误")
class RegForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三" # 设置默认值,初始值,input框里面的初始值
error_messages={ #重写错误信息。
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
}
)
pwd = forms.CharField(
min_length=6,
label="密码",
widget=forms.widgets.PasswordInput(attrs={"class": "c1"}, render_value=True)
#给input标签添加class="c1",刷新页面保留原input框中的值
validators=[RegexValidator(r"^[0-9]+$", "请输入数字"), RegexValidator(r"^159[0-9]+$", "数字必须以159开头")], #自定义正则校验器,如果不符合正则匹配则显示"请输入数字"
validators=[passward_validate, ],#使用自定义验证函数
)
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别",
initial=3,
widget=forms.widgets.RadioSelect() #单radio值为字符串
)
hobby = forms.fields.ChoiceField( #单选Select
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=3,
widget=forms.widgets.Select()
)
hobby = forms.fields.MultipleChoiceField( #多选Select
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=[1, 3],
widget=forms.widgets.SelectMultiple()
)
keep = forms.fields.ChoiceField( #单选checkbox
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput()
)
hobby = forms.fields.MultipleChoiceField( #多选checkbox
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple()
)
def __init__(self, *args, **kwargs): #动态choices选项
super(RegForm,self).__init__(*args, **kwargs)
# self.fields["hobby"].choices = ((1, "篮球"), (2, "足球"),)
self.fields["hobby"].choices = models.Hobby.objects.all().values_list("id","name")
# 使用form组件实现注册方式
def register2(request):
form_obj = RegForm()
if request.method == "POST":
form_obj = RegForm(request.POST) # 实例化form对象的时候,把post提交过来的数据直接传进去
if form_obj.is_valid(): # 调用form_obj校验数据的方法
#print(form_obj.cleaned_data) # 获取所有经过验证的数据
models.User.objects.create(**form_obj.cleaned_data)
return HttpResponse("注册成功")
return render(request, "register.html", {"form_obj": form_obj})

![Form组件、auth认证组件、自定义图片验证码登录、 自定义分页[Python常见问题]](https://www.zixueka.com/wp-content/uploads/2023/10/1696934790-fea76dac45c35ff.jpg)
