回忆一下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. 无连接运输的UDP、可靠数据传输原理、面向连接运输的TCP

    由[RFC 768]定义的UDP只是做了运输协议能够做的最少工作.除了复用/分解功能极少量的差错检测外,它几乎没有对IP增加别的东西.如果应用程序开发人员选择UDP而不是TCP,则该应用程序差不多就是 ...

  2. js 数字前自动补零

    num为传入的数字,n为需要的字符长度 return (Array(n).join(0) + num).slice(-n); 例如 我想返回两位数  输入6 然后返回06 就可以这样写: return ...

  3. C# 正则表达式贪婪模式案例

    案例一. 如 "acbacb"  正则  "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ...

  4. Luogu P4321 随机漫游

    期望DP要倒着推 Luogu P4321 题意 LOJ #2542 不一定是树,询问点不一定均为1 $Solution$ 设计一个巧妙的DP状态 设$ F(S,x)$表示当前在点$ x$已经走遍了$ ...

  5. 【洛谷P1706全排列问题】

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 代码如下: #include<iostream>#include<cstd ...

  6. day14 带参装饰器、迭代器、生成器

    """ 今日内容: 1.带参装饰器及warps 2.迭代器 3.生成器 """ """ # 一.带参装饰器及w ...

  7. Lua中的语句

    [赋值] 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许“多重赋值”,也就是一下子将多个值赋予多个变量,例如以下代码: , pr ...

  8. get/post比较

    转载: https://www.oschina.net/news/77354/http-get-post-different https://www.cnblogs.com/wswang/p/6054 ...

  9. 库数据有则修改,无则新增sql

    方法一:insert中on duplicate key update的使用 例如: <insert id="bindPlaceInfo"> insert into gr ...

  10. centos查看系统/硬件信息及运维常用命令

    [root@yan-001 ~] # uname -a # 查看内核/操作系统/CPU信息的linux系统信息命令 [root@yan-001 ~] # head -n 1 /etc/issue # ...