一、传统表单校验
(1)models.py
from django.db import models
# Create your models here.
class UserInfo(models.Model):
username = models.CharField(verbose_name='用户名', max_length=30)
password = models.CharField(verbose_name='密码', max_length=10)
tel = models.CharField(verbose_name='手机号码', max_length=11, null=True)
email = models.EmailField(verbose_name='邮箱', null=True)
#数据
class Meta:
db_table='userinfo'
verbose_name='用户'
verbose_name_plural=verbose_name
#重写
def __str__(self):
return self.username
(2) views.py
def register(request):
# 提示错误信息
user_dict = {'username': '', 'password': '', 'tel': '', 'emails': ''}
# 使用post访问方式
if request.method == 'POST':
# 获取用户名,密码,手机号,邮箱
name = request.POST.get('username')
pwd = request.POST.get('password')
tel = request.POST.get('tel')
email = request.POST.get('emails')
# 判断
if not name:
user_dict['username'] = '用户名不能为空'
if len(name) > 6:
user_dict['username'] = '用户名不能为6个字符'
# 最短6位,最长8位 可以包含小写大母和大写字母可以包含数字可以包含下划线和减号
if not re.match(r'^[\w_-]{6,8}$', pwd):
user_dict['password'] = '密码强度不符合要求'
if not re.match(r'^130\d{8}$', pwd):
user_dict['tel'] = '手机号码必须130开头'
if not re.match(r'^\w+@\w+\.\w+|$', email):
user_dict['emails'] = '此邮箱不合法'
return render(request, 'myformcom.html', locals())
(3) myformcom.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<h2 class="title">用户注册-Form手动</h2>
<div class="form-group">
<label for="name">用户名:</label>
<input type="text" name="username" id="name" class="form-control" placeholder="请输入用户名">
<span style="color:red">{{ user_dict.username }}</span>
</div>
<div class="form-group">
<label for="pwd">密码:</label>
<input type="text" name="password" id="pwd" class="form-control" placeholder="请输入密码">
<span style="color:red">{{ user_dict.password }}</span>
</div>
<div class="form-group">
<label for="email">邮箱:</label>
<input type="email" name="emails" id="email" class="form-control" placeholder="请输入邮箱">
<span style="color:red">{{ user_dict.emails }}</span>
</div>
<div class="form-group">
<label for="tel">手机号:</label>
<input type="tel" name="tel" id="tel" class="form-control" placeholder="请输入手机号">
<span style="color:red">{{ user_dict.tel }}</span>
</div>
<div class="form-group">
<input type="submit" value="提交" class="btn btn-success">
</div>
</form>
</body>
</html>
(4) 运行
二、Django Form 组件
它用于对页面进行初始化,生成 HTML 标签,此外还可以对用户提交的数据进行校验(显示错误信息)。forms组件的主要功能如下:
Form定义在views.py文件中
# #定义form类
class UserInform(Form):
username = forms.CharField(max_length=6, error_messages={
'required': '名字不能为空', 'invalid': '请输入正确的名字'
})
password = forms.CharField(max_length=8, min_length=6, error_messages={
'required': '请输入密码', 'min_length': '密码最低6位', 'max_length': '密码超过8位'
})
email = forms.EmailField(required=False, error_messages={
'invalid': '请输入正确的邮箱'
}) # 可以不输入
tel = forms.CharField(validators=[
RegexValidator(r'^13\d{9}$', '请输入正确的手机号码') # 自定义校验规则
], required=False)
Form内置字段说明:
(1)CharField(Field)
(2)DecimalField(IntegerField)
(3) IntegerField(Field)
1、默认表单的数据:
def register2(request):
data={"username":"","password":"123","email":"111","tel":"130"}
# 使用form表单对象
form_obj = UserInform(data)
# 判断传入的数据是否合法
if not form_obj.is_valid():
# 校验不通过
print(form_obj.errors) # 校验失败的错误信息
else:
print(form_obj.cleaned_data) # 校验成功之后的数据
return render(request, 'myformcom2.html', locals())
页面 myformcom2.html
渲染一
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="" method="post">
<h2 class="title">用户注册-Form组件</h2>
<p>第一种渲染方式</p>
{{ form_obj }}
</form>
</body>
运行
渲染二
<form action="" method="post">
<h2 class="title">用户注册-Form组件</h2>
<p>第二种渲染方式</p>
<div class="form-group">
<label for="name">用户名:</label>
<input type="text" name="username" id="name" class="form-control" placeholder="请输入用户名" required maxlength="6">
</div>
<div class="form-group">
<label for="pwd">密码:</label>
<input type="text" name="password" id="pwd" class="form-control" placeholder="请输入密码" required maxlength="8" minlength="6">
</div>
<div class="form-group">
<label for="email">邮箱:</label>
<input type="email" name="emails" id="email" class="form-control" placeholder="请输入邮箱" required>
</div>
<div class="form-group">
<label for="tel">手机号:</label>
<input type="tel" name="tel" id="tel" class="form-control" placeholder="请输入手机号">
</div>
</form>
渲染三
<form action="" method="post">
<h2 class="title">用户注册-Form组件</h2>
<p>第三种渲染方式</p>
{# {{ form_obj.as_ul }}#}
{# {{ form_obj.as_div }}#}
{{ form_obj.as_p }}
</form>
2、根据表单提交数据 views.py
def register3(request):
# 使用post方式
if request.method == 'POST':
# 获取 POST 请求的数据
data: dict = request.POST
# 使用form表单对象
form_obj = UserInform(data)
# 判断传入的数据是否合法
if not form_obj.is_valid():
# 校验不通过
print(form_obj.errors) # 校验失败的错误信息
else:
print(form_obj.cleaned_data) # 校验成功之后的数据
return render(request, 'myformcom3.html', locals())
myformcom3.html
<form action="" method="post" data-options="novalidate:true">
{% csrf_token %}
<h2 class="title">用户注册-Form组件</h2>
<div class="form-group">
<label for="name">用户名:</label>
<input type="text" name="username" id="name" class="form-control" placeholder="请输入用户名">
<span style="color:red">{{ form_obj.username.errors.0}}</span>
</div>
<div class="form-group">
<label for="pwd">密码:</label>
<input type="text" name="password" id="pwd" class="form-control" placeholder="请输入密码">
<span style="color:red">{{ form_obj.password.errors.0}}</span>
</div>
<div class="form-group">
<label for="email">邮箱:</label>
<input type="email" name="emails" id="email" class="form-control" placeholder="请输入邮箱">
<span style="color:red">{{ form_obj.emails.errors.0 }}</span>
</div>
<div class="form-group">
<label for="tel">手机号:</label>
<input type="tel" name="tel" id="tel" class="form-control" placeholder="请输入手机号">
<span style="color:red">{{ form_obj.tel.errors.0}}</span>
</div>
<div class="form-group">
<input type="submit" value="提交" class="btn btn-success">
</div>
</form>
运行