django的form表单验证
通过HTML向后台提交数据时,需要对提交的数据进行验证,比如:长度,手机号是否是11位等等各种验证条件,这时就可以使用django提供的form进行验证
在app的根目录创建forms.py文件
forms.py
from django import forms
from django.core.exceptions import ValidationError #抛出异常用的
from user import models
# 公共验证器
# 第一个进行的验证方式
def test_phone(value):
if len(value)!=11:
raise ValidationError('手机格式不正确')
return value
class ArticleForm(forms.Form):
phone = forms.CharField(required=True, # 是否必填
validators=[test_phone], # 自定义验证方式,例如:公共验证方法 最先执行
error_messages={ # 错误信息提示
'required': '必填',
'max_length': '最大18个字符'
})
title = forms.CharField(required=True,#是否必填
max_length=10, #最大长度
min_length=5,# 最小长度
strip=False,# 是否去掉用户输入的空格 默认是True
# empty_value = 'TitleInit', #默认值,当前端不传递时接收到的信息
error_messages={ #错误信息提示
'required':'必填',
'max_length': '最大18个字符',
'min_length': '最小5个字符'
})
# forms中存在钩子函数 clean
# 第三步:全部数据进行验证
# 验证手机号特殊的逻辑
def clean(self):
# 通过self.cleaned_data 可以获取到所有数据
print('clean',1)
return self.cleaned_data
# 针对个别字段进行验证
# 第二步:针对个别字段进行验证
def clean_phone(self):
print('clean-phone', 2)
return self.cleaned_data.get('phone')
'''
Form和Model结合,能够省略定义Form定义字段。 共用Model
'''
def test_name(value):
if value =='dxs':
raise ValidationError('姓名不存在')
else:
return value
class StudentForm(forms.ModelForm):
# 当你觉得model写的验证规则不符合你的要求时,可以像forms.Form一样进行验证
name = forms.CharField(validators=[test_name])
class Meta:
model = models.Student #创建类变量和model建立映射关系
# fields = '__all__' #验证全部字段
# fields = ['name'] #显示指定列验证 只有指定的验证字段才会出现在cleaned_data中
exclude = ['name'] #排除了就不会出现在cleaned_data中
# 在使用forms.ModelForm后,一样也可以像forms.Form一样自己定义字段定义
# 自己在form中定义的字段,在数据库时会出问题,因为数据库没这个字段,所以不建议这样使用
# 或者自己要处理下返回的cleaned_data
# 这种常用于,认为model写的验证不够完美,可以重新定义这个字段的验证规则
# # clean的原则和forms.Form相同
def clean(self):
if self.cleaned_data.get('name') =='shz':
raise ValidationError('姓名是射手座')
else:
return self.cleaned_data
# 单个字段验证,必须保证在form中有写这个字段
def clean_name(self):
if self.cleaned_data.get('name') == 'nhy':
raise ValidationError('姓名是nhy')
else:
return self.cleaned_data.get('name')
post.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/post" method="post">
{% csrf_token %}
<h1>写文章的</h1>
<div>
title:<input type="text" name="title">
</div>
<div>
phone:<input type="text" name="phone">
</div>
<div>
<select name="category">
{% for category in categories %}
<option value="{{ category.id }}">{{ category.name }}</option>
{% endfor %}
</select>
</div>
<div>
<input type="submit" value="提交">
</div>
</form>
</body>
</html>
student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/student" method="post">
{% csrf_token %}
<h1>创建学生</h1>
<div>
name:<input type="text" name="name">
</div>
<div>
age:<input type="text" name="age">
</div>
<div>
</div>
<div>
<input type="submit" value="提交">
</div>
</form>
</body>
</html>
views.py
def article(request): if request.method=='GET': return render(request,'post.html') else: # 实例化form验证器,接收post传过来的数据 articleObj = ArticleForm(request.POST) # 判断当前写好的验证器是否验证通过 返回True或false f = articleObj.is_valid() if f: # 验证通过的数据,存在了一个叫cleaned_data # 验证通过的字段会都在cleaned_data中,是个dict print('articleObj.cleaned_data',articleObj.cleaned_data) msg = '成功' # 验证通过后,可以做参数据库的操作 else: print('is_valid',f) # 拿到错误信息 print('articleObj.errors',articleObj.errors) # 通过dict方式取信息 print('articleObj.errors',articleObj.errors.get_json_data()) # msg = articleObj.errors.get_json_data().get('title')[0].get('message') # return HttpResponse(msg) return HttpResponse(articleObj.errors) def student(requests): if requests.method=='GET': return render(requests,'student.html') else: studentObj = StudentForm(requests.POST) f = studentObj.is_valid() if f: print('cleaned data',studentObj.cleaned_data) else: print('error',studentObj.errors.get_json_data()) return HttpResponse('ok')
models.py
class Student(models.Model):
name = models.CharField(verbose_name='老师名字',max_length=50)
age = models.IntegerField(verbose_name='年龄')
class Meta:
db_table = 'student'