回忆一下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表单验证的更多相关文章

  1. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  2. Django 中的Form表单认证

    一.Form表单   1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签   1.2 创建表单类Form 1. 创建 ...

  3. Django基础之Form表单验证

    Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...

  4. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  5. django中的 form 表单操作

     form组件  1. 能做什么事?   1. 能生成HTML代码  input框   2. 可以校验数据   3. 保留输入的数据   4. 有错误的提示   1. 定义   from django ...

  6. the django travel three[form表单验证]

    一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...

  7. 九 Django框架,Form表单验证

    表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. django中写form表单时csrf_token的作用

    之前在学习django的时候,在template中写form时,出现错误.百度,google后要加{% csrf_token %}才可以,之前一直也没研究,只是知道要加个这个东西,具体是什么也不明白. ...

  9. django中使用form表单,数据库保存密码出现明文

随机推荐

  1. 抓包工具Charles基本用法

    我们在进行B/S架构的Web项目开发时,在前端页面与后台交互的调试的时候,通常使用在JSP中加入“debugger;”断点,然后使用浏览器的F12开发者工具来查看可能出错的地方的数据.或者使用Http ...

  2. [物理学与PDEs]第1章习题10 自由电磁场在 Lorentz 规范变换下可使标势为零

    在自由电磁场的情况, 证明: 在保持 Lorentz 条件下的规范变换下, 可使标势恒为零. 证明: 取 $\psi$ 满足 $\cfrac{\p \psi}{\p t}=\phi$ 且 $\cfra ...

  3. RC522射频卡读写模块驱动(仅读取)

    目录 说明 测试结果 main RC522.h RC522.c 说明 更改了网上的源代码,仅保留了读取序列号并通过串口回传的功能.版本号:V1 感谢 https://blog.csdn.net/qq_ ...

  4. 模组 前后端分离CURD 组件

    js (function () { // {# -------------------------------------------------------------------------- # ...

  5. C++设计模式——桥接模式

    问题描述 现在要去画一个图形,图形有长方形.圆形和扇形等等:而图形又可以加上不同的颜色,然后,我们就可以画出红色的长方形,绿色的长方形:红色的圆形,绿色的圆形等等.而这种图形的形状在变化,图形的颜色也 ...

  6. 网络编程中select模型和poll模型学习(linux)

    一.概述 并发的网络编程中不管是阻塞式IO还是非阻塞式IO,都不能很好的解决同时处理多个socket的问题.操作系统提供了复用IO模型:select和poll,帮助我们解决了这个问题.这两个函数都能够 ...

  7. noj算法 迷宫问题 回溯法

    描述: 给一个20×20的迷宫.起点坐标和终点坐标,问从起点是否能到达终点. 输入: 多个测例.输入的第一行是一个整数n,表示测例的个数.接下来是n个测例,每个测例占21行,第一行四个整数x1,y1, ...

  8. RDay2-Problem 2 B

    题目描述 小明家有n个信箱,前前后后来送信和取信的总次数为q,称为q次访问,其中这q次访问分成三种类型. 1:邮递员送来了一封信,放在了x号信箱. 2:小明取走了x号信箱的所有信(x信箱可能已经没有信 ...

  9. 【sklearn】数据预处理 sklearn.preprocessing

    数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...

  10. Flask上下文管理源码--亲自解析一下

    前戏 偏函数 def index(a,b): return a+b # 原来的调用方法 # ret=index(1,2) # print(ret) # 偏函数--帮助开发者自动传递参数 import ...