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})