Django表单类与校验
表单功能在开发的过程当中有一半的需求是获取数据,另一半校验数据。针对于表单,校验分为前端校验和后端校验:
前端校验:就是通过js或者jq脚本对form表单输入的数据进行校验,形象,直观,有利于对用户进行提醒,用户体验好。
后端校验:就是在视图当中或者python后端当中对提交的数据进行校验,比较安全。
前端校验我们可以通过各种校验框架进行校验,django推出了自己的form表单类来定义后端校验。
表单类
Form表单类是有django定义的,可以自动生成前端form表单代码的表单类,已经完成大部分的校验功能。常用的form表单样式:as_P,as_ul,{% for %}
Django 的form表单没有携带form外标签,也没有提交按钮,这样的设计更方便开发者修改样式
Form表单类通用的参数:
Max_length | 最大长度 |
---|---|
Min_length | 最小长度 |
required | 为False为可以为空,默认为True |
label | Form表单的标签内容 |
Help_text | 帮助文档 |
在app中创建一个forms.py文件
from django import forms
class UserForm(forms.Form):
# required 不可为空,默认为True
# label = '用户名', 表格前的字段名
# help_text = "填写6-8位字母数字" 提示
username = forms.CharField(label='用户名',help_text="填写6-8位字母数字")
password = forms.CharField(label='密码',widget=forms.PasswordInput)
age = forms.IntegerField(label='年龄')
email = forms.EmailField(label='邮箱')
birthday = forms.DateField(label='生日')
视图
def djangoForm(request):
userForm = UserForm()
return render(request,'djangoForm.html',locals())
页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<p>基础的userForm</p>
<br>
<p>{{ userForm }}</p>
</div>
<p>++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++</p>
<div>
<p>p标签格式的userForm</p>
<br>
<p>{{ userForm.as_p }}</p>
</div>
<p>++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++</p>
<div>
<p>ul li格式的userForm</p>
<br>
<p>{{ userForm.as_ul }}</p>
</div>
<p>++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++</p>
<div>
<p>循环自定义的userForm----post请求</p>
<br>
<form class="register_form" method="post">
{% csrf_token %}
<table>
{% for uf in userForm %}
<tr>
<th>{{ uf.label }}</th>
<td>{{ uf }}</td>
<td>{{ uf.help_text }}</td>
</tr>
{% endfor %}
<tr>
<th colspan="2">
<input type="submit" value="提交">
</th>
</tr>
</table>
</form>
</div>
<p>++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++</p>
<div>
<p>循环自定义的userForm----git请求</p>
<br>
<form class="register_form" >
<table>
{% for uf in userForm %}
<tr>
<th>{{ uf.label }}</th>
<td>{{ uf }}</td>
<td>{{ uf.help_text }}</td>
</tr>
{% endfor %}
<tr>
<th colspan="2">
<input type="submit" value="提交">
</th>
</tr>
</table>
</form>
</div>
</body>
</html>
校验
首先创建一个表格,并同步数据库。
在forms.py中添加需要校验的内容
from django import forms
from django.forms import ValidationError
class UserForm(forms.Form):
# required 不可为空,默认为True
# label = '用户名', 表格前的字段名
# help_text = "填写6-8位字母数字" 提示
username = forms.CharField(label='用户名',
help_text="填写6-8位字母数字")
password = forms.CharField(label='密码',widget=forms.PasswordInput)
age = forms.IntegerField(label='年龄')
email = forms.EmailField(label='邮箱')
birthday = forms.DateField(label='生日')
def clean_username(self):
'''
所有自定义的校验方法一定是clean_校验的字段名
:return:
'''
username = self.cleaned_data.get('username')
if 'GM' in username:
raise ValidationError("昵称违规")
else:
return username
视图
对表单上返回的数据进行请求,然后传递给forms.py进行判断,如果校验通过,则保存到数据库,否则,返回错误。
def registerForm(request):
userForm = UserForm() #实例化form表单,用于前端渲染
error = ""
if request.method == "POST":
data = UserForm(request.POST) #将post请求的数据传递给UserForm进行校验
if data.is_valid():#如果校验成功,返回true
clean_data = data.cleaned_data #返回一个放着校验过的数据的字典
user = UserModel()
user.username = clean_data.get("username")
user.password = clean_data.get("password")
user.age = clean_data.get("age")
user.email = clean_data.get("email")
user.birthday = clean_data.get("birthday")
user.save()
else:
error = data.errors
return render(request,"register_user.html",locals())
页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
li{
list-style: none;
}
*{
font-size: 20px;
}
.errorlist{
color: red;
font-size: 18px;
}
</style>
</head>
<body>
<form method="post" class="register_form">
{% csrf_token %}
{% for u in userForm %}
<p>
<label>{{ u.label }}</label>
{{ u }}
</p>
{% endfor %}
<p>
<input type="submit" value="提交">
</p>
</form>
{{ error }}
</body>
</html>