Django Form介绍
form组件的用法
调用类
from django import forms
调用插件
from django.forms import widgets
定义类
class 类名(forms.Form)
添加参数
user = forms.CharField(参数1...) #字符串格式
email=forms.EmailField(参数1...) #Email格式
gender = forms.ChoiceField(参数1...) #单选选择格式
gender = forms.MultipleChoiceField(参数1...) #多选选择格式
生产HTML文件
实例化一个form对象, 传递到模板语言中
form_obj = RegForm()
在目标语言中调用form对象的响应方法和属性
做校验:
form_obj = RegForm(request.POST)
form_obj.is_valid()
min_length参数 #最小位限制
min_length=4,
max_length参数 #最小位限制
max_length=16,
label参数 #label的名字
label="用户名",
initial参数 # 设置默认值
initial="张三"
widget参数 #控制的是生成html代码相关的
widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True),
validators参数 #自定义校验
validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
error_messages参数 #重写错误信息
前面为错误触发,后面为错误触发后提示的信息
error_messages={
"required": "不能为空",
"invalid": "格式错误",
'min_length':'账户不能小于4位',
'max_length':'长度不能超过12位',
}
例:
name = forms.CharField(min_length=4,
max_length=12,
label='账户',
initial='aaa',
error_messages={
"required": "不能为空",
"invalid": "格式错误",
'min_length':'账户不能小于4位',
'max_length':'长度不能超过12位',
})
password参数 #密码变成远点,非明文
widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
RadioSelect #圆点单选
gender = forms.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别",
initial=3, #默认选3
widget=forms.widgets.RadioSelect #将选择变成圆点单选
)
Select #下拉框单选
hobby = forms.ChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=3,
widget=forms.widgets.Select #将选择变成下拉框单选
)
SelectMultiple #下拉框多选
hobby = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=[1, 3], #多选默认需要用列表
widget=forms.widgets.SelectMultiple #将选择变成下拉框多选
)
CheckboxInput #方框单选
keep = forms.ChoiceField(
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput #方框单选
)
CheckboxSelectMultiple #方框多选
hobby = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple #方框多选
)
TextInput #给input标签加类
widgets=widgets.TextInput(attrs={"class":"a"}),
choices自定义构造方法
def __init__(self, *args, **kwargs): #重构父类方法
super().__init__(*args, **kwargs)
#从数据库取值然后赋予,因为用于多选,他的值是小元组的方式,所以数据库取值时要用values_list
self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')
form 自定义校验
导入校验模块
from django.core.validators import RegexValidator
RegexValidator 进行正则校验
validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
钩子函数修改
#导入异常方法
from django.core.exceptions import ValidationError
def clean_name(self): #查找name
value = self.cleaned_data.get("name") #取出name数据
if "JPM" in value: #包含JPM就报错
raise ValidationError("不符合社会主义核心价值观!") #返回错误异常
return value #不报错正常返回数据
# 重写父类的clean方法
def clean(self):
# 此时 通过检验的字段的数据都保存在 self.cleaned_data
pwd = self.cleaned_data.get("pwd") #取密码1
re_pwd = self.cleaned_data.get("re_pwd") #取重复密码2
if pwd != re_pwd: #判断
self.add_error("re_pwd", ValidationError("两次密码不一致")) #两次密码不一致就加错误
raise ValidationError("两次密码不一致") #然后返回错误异常不一致
return self.cleaned_data #没错误直接返回数据