django--form组件
---恢复内容开始---
form组件主要的作用
1、生成HTML标签
2、初始化页面数据
3、验证用户输入的数据以及反馈错误信息
4、HTMLFORM保留上次提交内容
form组件用法
from django import forms
导入forms组件包 class RegForm(forms.Form): username = forms.CharField(max_length=8,
min_length=3,
label='用户名',
error_messages={ 'max_length':'用户名最长八位', 'min_length':'用户名最短三位', 'required':'用户名不能为空' },widget=forms.widgets.TextInput(attrs={"class":'form-control'}) ) password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={ 'max_length': '密码最长八位', 'min_length': '密码最短三位', 'required': '密码不能为空' }, widget=forms.widgets.PasswordInput(attrs={"class": 'form-control'}) ) confirm_password = forms.CharField(max_length=8, min_length=3, label='确认密码', error_messages={ 'max_length': '确认密码最长八位', 'min_length': '确认密码最短三位', 'required': '确认密码不能为空' }, widget=forms.widgets.PasswordInput(attrs={"class": 'form-control'}) ) email = forms.EmailField(label='邮箱',error_messages={ 'invalid':'邮箱格式错误', 'required':'邮箱不能为空' },widget=forms.widgets.EmailInput(attrs={'class':'form-control'}))
前端渲染页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>register</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="/static/bs-3.3.7/css/bootstrap.css"> <script src="/static/bs-3.3.7/js/bootstrap.min.js"></script> </head> <body> <form action="" id="my_form"> {% csrf_token %} {% for foo in form_obj %} <label for='{{ foo.auto_id }}'>{{ foo.label }}</label> {{ foo }} <span class="pull-right"></span> {% endfor %} <div> <label for="id_avatar"> 头像 <img src="/static/image/default.jpg" alt="" id="my_img" style="width: 50px"> </label> <input type="file" id="id_avatar" name="my_avatar" class="hidden"> </div> <input type="button" class="btn btn-success pull-right" value="注册" id="id_submit"> </form> </form> </body>
form类常用的参数
initial :初始值
input框里的初始参数
class LoginForm(forms.Form): username = forms.CharField( min_length=8, label="用户名", initial="张三" # 设置默认值 )
error_messages : 重写错误信息
email = forms.EmailField(label='邮箱',error_messages={ 'invalid':'邮箱格式错误', 'required':'邮箱不能为空'
widget窗口部件
需要更改某个表单默认的元素就需要使用widget,并且改变其元素属性就需要使用attrs。
password = forms.CharField(max_length=8, min_length=3, label='密码', error_messages={ 'max_length': '密码最长八位', 'min_length': '密码最短三位', 'required': '密码不能为空' }, widget=forms.widgets.PasswordInput(attrs={"class": 'form-control'}),
render_value=True )
其中
attrs={"class": 'form-control'} 是为当前input标签增加样式类
render_value=True 是指当前输入的密码校验失败的话是否保留输入框原有的值,True代表保留
单选Select
hobby = forms.fields.ChoiceField( choices=((1, "song"), (2, "jump"), (3, "rap"), ), label="爱好", initial=3, widget=forms.widgets.Select )
多选Selete
hobby = forms.fields.MultipleChoiceField( choices=((1, "song"), (2, "dance"), (3, "rap"), ), label="爱好", initial=[1, 3], widget=forms.widgets.SelectMultiple )
单选checkbox
keep= forms.fields.ChoiceField( label="是否记住密码", initial="checked", widget=forms.widgets.CheckboxInput )
多选checkbox
hobby = forms.fields.MultipleChoiceField( choices=((1, "song"), (2, "dance"), (3, "rap"),), label="爱好", initial=[1, 3], widget=forms.widgets.CheckboxSelectMultiple )
Form校验
一、使用正则表达式
def mobile_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('手机号码格式错误')
二、钩子函数
# 局部钩子 判断当前用户名是否存在 def clean_username(self): username = self.cleaned_data.get('username') user_obj = models.Userinfo.objects.filter(username=username).first() if user_obj: self.add_error('username','用户名已存在') else: 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','两次密码不一致') else: return self.cleaned_data #返回校验后的数据