![8d3a054305a0a68d6f2d78054d760377.png](https://img-blog.csdnimg.cn/img_convert/8d3a054305a0a68d6f2d78054d760377.png)
Ⅰ forms组件介绍
- 注册功能,登录功能,前端需要校验(字段长度,邮箱是否合法....)
- 前端校验可以没有,后端校验是必须的,使用传统方式 if判断写的很多
- 借助于forms组件,可以快速实现字段的校验
- 导入:from django.forms import Form
Ⅱ forms校验字段功能
- 自定义校验的字段及校验的方式
# 自定义校验
class RegisteredForm(forms.Form):
name = forms.CharField(max_length=32,min_length=3) # 最长,32,最短 3
password1 = forms.CharField(max_length=32,min_length=8,label='模板渲染使用')
password2 = forms.CharField(max_length=32,min_length=8)
pass
- 视图函数中使用
- from app01.view import src # 自定义校验,导入
- 数据校验成功的情况
data={'name':'wot','password1':'333334444','password2':'333334444'}
form=src.RegisteredForm(data)
if form.is_valid():
print('校验通过')
print('我是通过的数据',form.cleaned_data)
![e2be7cc3522e00e455b70c42f6d216c1.png](https://img-blog.csdnimg.cn/img_convert/e2be7cc3522e00e455b70c42f6d216c1.png)
- 数据校验失败的情况
data={'name':'wot','password1':'333','password2':'333334444'}
form=src.RegisteredForm(data)
if form.is_valid():
print('校验通过')
print('我是通过的数据',form.cleaned_data) # 不一定是上面传入的数据
else:
print('我是校验失败后,校验成功的数据',form.cleaned_data)
# 哪个字段失败了?失败的原因是什么
print('我是失败的信息,默认ul标签格式',form.errors)
from django.forms.utils import ErrorDict
#### 重写了__str__
print('json格式的失败信息',form.errors.as_json())
print('字典格式的错误信息',form.errors.as_data())
# form.errors.as_ul() # 是为了渲染模板
return HttpResponse('ok')
![e76e9360928ce1d2fadefba753696d8a.png](https://img-blog.csdnimg.cn/img_convert/e76e9360928ce1d2fadefba753696d8a.png)
Ⅲ forms渲染模板功能
- 视图函数
def register(request):
if request.method == 'GET':
form = src.RegisteredForm()
return render(request, 'register.html', {'form': form})
elif request.method == 'POST':
# 数据校验
form = src.RegisteredForm(request.POST)
if form.is_valid():
print('校验通过,存数据库')
else:
print(form.errors.as_data())
print('校验失败,返回错误')
return HttpResponse('ok')
- 模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<hr>
<h1>手动创建模板</h1>
<form action="" method="post">
<p>用户名:<input type="text" name="name"></p>
<p>密码:<input type="text" name="password1"></p>
<p>确认密码:<input type="text" name="password2"></p>
<p><input type="submit" value="提交"></p>
</form>
<hr>
<h1>半自动渲染模板1</h1>
<form action="" method="post">
<p>用户名:{{ form.name }}</p>
<p>密码:{{ form.password1 }}</p>
<p>确认密码:{{ form.password2 }}</p>
<p><input type="submit" value="提交"></p>
</form>
<h1>半自动渲染模板2(用的最多)</h1>
<form action="" method="post">
<p>{{ form.name.label }}--{{ form.name }}</p> // label需要在自定义的字段参数写上
<p>{{ form.password2.label }}---{{ form.password2 }}</p>
<p>{{ form.password1.label }}---{{ form.password1 }}</p>
<p><input type="submit" value="提交"></p>
</form>
<h1>半自动渲染模板3(用的最多)</h1>
<form action="" method="post">
{% for foo in form %}
<p>{{ foo.label }} :{{ foo }}</p>
{% endfor %}
<p><input type="submit" value="提交"></p>
</form>
<h1>全自动(了解)</h1>
<form action="" method="post">
{# {{ form.as_ul }}#}
{{ form.as_p }}
{# <table>#}
{# {{ form.as_table }}#}
{# </table>#}
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
![ea29b5010e848cd0c20b72c807484114.gif](https://img-blog.csdnimg.cn/img_convert/ea29b5010e848cd0c20b72c807484114.gif)