Django的Form组件
一、自定义Form子类
1、自定义Form子类时需要继承Form类
2、Form子类的属性名必须与对应的标签name属性值相同
3、常用参数
required 该字段是否允许为空
error_message 字段填写错误时的错误信息,以字典形式赋值,value为错误提示,key为出现错误提示的情况,并且key值必须与参数名一致表示为该参数不满足时给出提示,比如key可以为required,min_length等
min_length 最小长度
max_length 最大长度
validators=[RegexValidators('正则规则','提示信息')] 使用指定正则验证输入,提示信息优先级没有error_message高
widget 使用什么插件,用于生成对应的标签,比如各种类型的input框,或者下拉框,在选定生成的标签中用attrs参数以字典形式设置该标签的属性,key为属性,value为属性值
choices 在选择字段提供选项
4、示例
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
from django.forms import Form,fields,widgets
from django.forms.models import ModelChoiceField
class TeacherForm(Form):
username=fields.CharField(
required=True,
error_messages={'required':'用户名不能为空'},
widget=widgets.TextInput(attrs={'placeholder':'用户名','class':'form-control'}))
password=fields.CharField(
required=True,
error_messages={'required':'密码不能为空'},
validators=[RegexValidators('正则规则','提示信息')],
widget=widgets.PasswordInput(attrs={'placeholder':'密码','class':'form-control'})
)
repeat_pwd = fields.CharField(
required=True,
error_messages={'required': '密码不能为空'},
widget=widgets.PasswordInput(attrs={'placeholder': '确认密码', 'class': 'form-control'})
)
email=fields.EmailField(
required=True,
error_messages={'required':'邮箱不能为空','invalid':'邮箱格式不正确'},
widget=widgets.EmailInput(attrs={'placeholder':'邮箱','class':'form-control'})
) #定义input标签
usertype=fields.ChoiceField(choices=[('1','讲师'),('2','班主任')]) #定义单选下拉框
classnames=fields.MultipleChoiceField(choices=[],widget=widgets.SelectMultiple(attrs={'size':2})) #定义多选下拉框
#classnames=ModelChoiceField(queryset=models.Classlist.objects.all()) #数据实时更新的下拉框,数据来源不灵活不推荐使用
def clean_username(self): #扩展验证,检测用户输入的用户名在数据库中是否存在,扩展方法的命名必须以clean_字段名的格式,取数据时只能取自己字段的数据,必须将数据返回
user = self.cleaned_data['username']
is_exsit = models.UserInfo.objects.filter(username=user).count()
if not is_exsit:
raise ValidationError('用户名不存在')
return user
def clean_password(self): #局部验证,方法名格式clean_字段名
user = self.cleaned_data['username']
return user
def clean(self): #全局验证
if .....:
return self.cleaned_data
else:
raise ValidationError('错误信息')
def __init__(self,*args,**kwargs): #实时更新下拉框数据
super().__init__(*args,**kwargs)
self.fields['classnames'].choices=models.ClassList.objects.values_list('id','caption')
二、自定义Form实例化
form=TeacherForm() #用于生成标签
form=TeacherForm(initial={'username':obj.username,'password':obj.password,'email':obj.email,'cls_list':[row.id for row in obj.teacher_to_cls.all()]}) #用于初始化标签的内容,多选下拉框初始化赋值使用列表
form=TeacherForm(data=request.POST) #用于后续验证用户输入以及创建或更新表数据
三、Form对象的属性和方法
form.add_error('字段名',ValidationError('用户名或密码错误')) 给form.errors添加错误信息
form.is_valid() 验证用户提交的数据,返回值是个布尔值
form.cleaned_data 验证通过的数据,是一个字典
form.errors 验证失败的字段的错误信息,是一个列表
四、使用Form对象生成标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<div class="container">
<div class="col-md-6 col-md-offset-3">
<form class="form-horizontal" style="margin-top: 100px" method="post" novalidate>
{% csrf_token %}
{% block form %}
<!--第一个是生成标签若有数据就初始化标签的内容,第二个是错误信息-->
<p>{{ form.username }} {{ form.username.error_messages.0 }} {{ message_name }}</p>
<p>{{ form.password }} {{ form.password.error_messages.0 }}</p>
<p>{{ form.repeat_pwd }} {{ form.repeat_pwd.error_messages.0 }}</p>
<p>{{ form.email }} {{ form.email.error_messages.0 }}</p>
<p>{{ form.usertype }} {{ form.usertype.error_messages.0 }}</p>
<p>{{ form.classnames }} {{ form.classnames.error_messages.0 }} {{ message_class }}</p>
{% endblock form %}
<input type="submit" value="提交">
</form>
</div>
</div>
</body>
</html>

浙公网安备 33010602011771号