Django中的Form表单验证
回忆一下Form表单验证的逻辑:
前端有若干个input输入框,将用户输入内容,以字典传递给后端。
后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法。该方法会先定义好错误信息的字典,并会遍历类的所有属性(对应前端待验证的输入域),调用各自的验证方法,将错误信息(两类,必要与否以及格式正确与否)存入字典,并得出最终的验证结果。在使用时,需要定义继承自Form基类不同的Form类,以对应有着不同输入域的Form表单。在拿到前端给的字典前,要先初始化自定义From类,直接执行封装好的整体验证方法,拿到结果后就可以抛给前端了。
Django中Form表单验证涉及到的知识:
1.Django中的ErrorDcit类如何封装了错误信息
# project/app01/forms.py from django import forms # 继承自Django的Form类
# 内部以字段形式定义验证域
class MyForm(forms.Form):
user = forms.CharField()
pwd = forms.CharField()
# project/app01/views.py
def form(request):
from app01.forms import MyForm
if request.method == 'POST':
f = MyForm(request.POST)
ret = f.is_valid() # bool
data = f.cleaned_data # {'user': 'asd', 'pwd': 'asd'}
errors = f.errors # ErrorDict,打印时因为__str__方法,会显示位ul标签的形式
print(errors.get('user', None)[0] if errors.get('user', None) else None) # ErrorList,以索引取出第一条错误信息
return render(request, "form.html", {"errors": f.errors})
return render(request, "form.html")
# project/templates/forms.html
<form action="/form/" method="post">
<div>
用户名:<input type="text" name="user"/>
</div>
<div>
密码:<input type="password" name="pwd"/>
</div>
<div>
<input type="submit" value="提交"/>
</div>
{{ errors }}
<div></div>
2.抛给前端的ErrorDcit及使用模板语言漂合理展示
展示错误信息的前端布局
通过返回Form类和模板语言在前端动态生成input标签
# project/app01/views.py
def form(request):
from app01.forms import MyForm
empty_form = MyForm()
if request.method == 'POST':
f = MyForm(request.POST)
if f.is_valid():
print(f.cleaned_data)
# 这里只是为了使得正确提交后不至于让input消失,实际坏境中这里应该是用户信息验证
return render(request, "form.html", {'myform': empty_form})
return render(request, "form.html", {"errors": f.errors, "myform": f})
else:
return render(request, "form.html", {'myform': empty_form})
# project/templates/forms.html
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.input-group{
padding: 15px;
}
.input-group input{
width: 200px;
}
.input-group span{
display: inline-block;
position: relative;
border: 1px solid red;
top: 25px;
left: -211px;
} </style>
</head>
<body>
<form action="/form/" method="post">
<div class="input-group">
<div style="float:left;width:70px;">用户名:</div>
{{ myform.user }}
{% if errors.user.0 %}
<span>{{ errors.user.0 }}</span>
{% endif %}
</div>
<div class="input-group">
<div style="float:left;width:70px;">密码:</div>
{{ myform.pwd }}
{% if errors.pwd.0 %}
<span>{{ errors.pwd.0 }}</span>
{% endif %}
</div>
<div>
<input style="float:left;margin-left:15px;" type="submit" value="提交"/>
</div>
</form>
4.django.forms中的CharField参数
(required, min/max_length,error_messages,forms.widget)
不重启服务时数据库数据动态更新到前端(静态字段的特点)
field不合需求时自定义验证规则(validators参数)
# project/app01/forms.py from django import forms
from app01 import models def mobile_validate(value):
import re
mobile_re = re.compile("^(13[0-9]|14[579]|15[0-3,5-9]|1 6[6]|17[0135678]|18[0-9]|19[89])\\d{8}$")
if not mobile_re.match(value):
print('')
raise forms.ValidationError('手机号码格式不对哦') class MyForm(forms.Form): def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['book_type'] = forms.CharField(
widget=forms.Select(choices=models.BookType.objects.values_list('id', 'caption'))
) user = forms.CharField(min_length=4, max_length=10, widget=forms.TextInput)
pwd = forms.CharField(error_messages={'required': '为什么不输入密码??'})
email = forms.EmailField(error_messages={'required': '邮箱还没输入哦', 'invalid': '邮箱格式错误'})
# book_type_choices = (
# (0, '小说'), value
# (1, '科普'), innerText
# ) # 元组内有元组
# 从数据库获得数据 # 注意这里filed都是静态字段
# 类的静态字段只创建一次以后不会再修改,新的对象都会使用同一份数据
# 所以MyForm这里的静态字段只会执行一次
# 加入数据库中的数据更新了,服务器不重启的话,这里从数据库取来的值是不会变的
# 因此将该字段写入类的初始化方法里,不要忘了执行父类的初始化方法哦
# book_type_choices = models.BookType.objects.values_list('id', 'caption')
# book_type = forms.CharField(
# widget=forms.Select(choices=book_type_choices)
# )
comment = forms.CharField(
widget=forms.Textarea(attrs={'style': 'border:1px solid red;'})
) # 可以为生成的标签添加属性 mobile = forms.CharField(
validators=[mobile_validate, ],
error_messages={'required': '手机号不填不行'},
widget=forms.TextInput
)
<div class="input-group">
<div style="float:left;width:70px;">用户名:</div>
{{ myform.user }}
{% if errors.user.0 %}
<span>{{ errors.user.0 }}</span>
{% endif %}
</div>
<div class="input-group">
<div style="float:left;width:70px;">密码:</div>
{{ myform.pwd }}
{% if errors.pwd.0 %}
<span>{{ errors.pwd.0 }}</span>
{% endif %}
</div>
<div class="input-group">
<div style="float:left;width:70px;">邮箱:</div>
{{ myform.email }}
{% if errors.email.0 %}
<span>{{ errors.email.0 }}</span>
{% endif %}
// 以下都是上面input-group标签的重复,只是field不同而已,不再细说
碎碎念:
中间给render传入两个字典,一直调试不出问题,费时颇久,下次留心。
Django中的Form表单验证的更多相关文章
- 第三百一十一节,Django框架,Form表单验证
第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...
- Django 中的Form表单认证
一.Form表单 1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签 1.2 创建表单类Form 1. 创建 ...
- Django基础之Form表单验证
Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...
- Django中的Form表单
Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...
- django中的 form 表单操作
form组件 1. 能做什么事? 1. 能生成HTML代码 input框 2. 可以校验数据 3. 保留输入的数据 4. 有错误的提示 1. 定义 from django ...
- the django travel three[form表单验证]
一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...
- 九 Django框架,Form表单验证
表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- django中写form表单时csrf_token的作用
之前在学习django的时候,在template中写form时,出现错误.百度,google后要加{% csrf_token %}才可以,之前一直也没研究,只是知道要加个这个东西,具体是什么也不明白. ...
- django中使用form表单,数据库保存密码出现明文
随机推荐
- 抓包工具Charles基本用法
我们在进行B/S架构的Web项目开发时,在前端页面与后台交互的调试的时候,通常使用在JSP中加入“debugger;”断点,然后使用浏览器的F12开发者工具来查看可能出错的地方的数据.或者使用Http ...
- [物理学与PDEs]第1章习题10 自由电磁场在 Lorentz 规范变换下可使标势为零
在自由电磁场的情况, 证明: 在保持 Lorentz 条件下的规范变换下, 可使标势恒为零. 证明: 取 $\psi$ 满足 $\cfrac{\p \psi}{\p t}=\phi$ 且 $\cfra ...
- RC522射频卡读写模块驱动(仅读取)
目录 说明 测试结果 main RC522.h RC522.c 说明 更改了网上的源代码,仅保留了读取序列号并通过串口回传的功能.版本号:V1 感谢 https://blog.csdn.net/qq_ ...
- 模组 前后端分离CURD 组件
js (function () { // {# -------------------------------------------------------------------------- # ...
- C++设计模式——桥接模式
问题描述 现在要去画一个图形,图形有长方形.圆形和扇形等等:而图形又可以加上不同的颜色,然后,我们就可以画出红色的长方形,绿色的长方形:红色的圆形,绿色的圆形等等.而这种图形的形状在变化,图形的颜色也 ...
- 网络编程中select模型和poll模型学习(linux)
一.概述 并发的网络编程中不管是阻塞式IO还是非阻塞式IO,都不能很好的解决同时处理多个socket的问题.操作系统提供了复用IO模型:select和poll,帮助我们解决了这个问题.这两个函数都能够 ...
- noj算法 迷宫问题 回溯法
描述: 给一个20×20的迷宫.起点坐标和终点坐标,问从起点是否能到达终点. 输入: 多个测例.输入的第一行是一个整数n,表示测例的个数.接下来是n个测例,每个测例占21行,第一行四个整数x1,y1, ...
- RDay2-Problem 2 B
题目描述 小明家有n个信箱,前前后后来送信和取信的总次数为q,称为q次访问,其中这q次访问分成三种类型. 1:邮递员送来了一封信,放在了x号信箱. 2:小明取走了x号信箱的所有信(x信箱可能已经没有信 ...
- 【sklearn】数据预处理 sklearn.preprocessing
数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...
- Flask上下文管理源码--亲自解析一下
前戏 偏函数 def index(a,b): return a+b # 原来的调用方法 # ret=index(1,2) # print(ret) # 偏函数--帮助开发者自动传递参数 import ...