[oldboy-django][2深入django]Form组件功能: 数据格式验证 + 保留上次输入的值
1 需求:登录或者注册页面存在以下问题
- 无法记住上次提交的内容,(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)
- 重复进行提交数据的校验(数据是否为空,长度大小等等)
2 django的Form组件实现
2.1 Form组件实现数据验证方法
2.1.1 流程操作
- 定义规则(数据的格式,字段必须和表单上name属性一致)
class LoginForm(Form):
字段名 = fields.xxFields(参数) # 定义了一个输入框的数据格式要求 实例化对象obj = LoginForm(request.POST) - 数据检验
obj.is_valid() - 提供详细错误信息(可以自定制错误提示)
-- 自定制错误信息,在类定义的时候通过error_messages参数
obj.errors - 提供符合规则的信息(类型是字典,数据库orm操作支持类型是字典操作)
obj.cleaned_data
2.1.2 实例
- Form提交(提交页面就会刷新,不保留上次输入内容)
- 流程
a.写类LoginForm(Form):
字段名 = fields.xxFields() # 验证规则,本质是正则表达式(fields.xxFields()是一个正则表达式)
字段名 = fields.xxFields() # 验证规则,本质是正则表达式
b. obj = LoginForm(request.POST)
c. 验证数据result = obj.is_valid()
d. 拿到符合格式的数据 obj.cleaned_data
e. 不符合格式,获取错误信息 obj.errors - 内部原理
"""
obj.is_valid()执行
1 LoginForm(request.POST)实例化时
self.fields = {
'username': 正则表达式,
'password': 正则表达式,
}
2 循环self.fields
flag = True
cleaned_data = {}
errors = {}
for k,v in self.fields.items():
#1 k = 'username', v = 正则表达式
#2 k = 'password', v = 正则表达式
input_value = request.POST.get(k)
if re.match(input_value, v):
flag = True
else:
flag = False
return flag """ - Form提交数据验证程序(没有实现保留上次输入的值)
# 前端
<form action="/app02/login" method="POST">
{% csrf_token %}
<p>
<input type="text" name="user" placeholder="用户名">
<span style="color:red;">{{ error.user.0 }}</span>
</p>
<p>
<input type="password" name="pwd" placeholder="密码">
<span style="color:red;">{{ error.pwd.0 }}</span>
</p>
<p><input type="submit" value="提交"></p>
</form> # LoginForm类
class LoginForm(Form):
user = fields.CharField(required=True,
error_messages={
'required': '不能为空',
})
pwd = fields.CharField(required=True,
min_length=8,
error_messages={
'required': '不能为空',
'min_length': '长度必须大于8'
}) # 视图
def login(request):
if request.method == 'GET':
return render(request, 'app02_login.html')
else:
obj = LoginForm(request.POST)
# 检验提交数据是否符合规则
if obj.is_valid():
print(obj.cleaned_data)
# obj.cleaned_data是一个字典,form表单提交的数据
#{'password': 'aaaaaaaaaa', 'username': 'alexadfdda'}
return redirect('/app02/login')
else:
return render(request, 'app02_login.html', {'error': obj.errors})
2.1.3 缺点
一点提交,页面就会刷新,不能保留上次输入的数据
2.2 Form组件实现保留上次输入方法
2.2.1原理:利用Form组件能够生成html标签来实现
a.原理: 利用Form组件可以生成标签
GET:
obj = TestForm()
{{ obj.t1 }} 等效成 <input type="text" name="t1">
POST:
obj = TestForm(request.POST)
{{ obj.t1}} 等效成<input type="text" name="t1" value = "你提交的数据"> 总之, 前端:{{ obj.t1 }}或者 {{obj.as_p}}
视图:无论get还是Post都将obj传给前端
2.2.2实例
b.实例
# FormL类
class TestForm(Form):
t1 = fields.CharField(
required=True,
min_length=4,
max_length=8,
widget=widgets.TextInput,
label='用户名',
label_suffix=':',
help_text='4-8个字符',
initial='root'
)
t2 = fields.CharField(
required=True,
min_length=8,
widget=widgets.PasswordInput,
label='密码',
label_suffix=':',
initial='password'
)
#视图
def test(request):
if request.method == 'GET':
obj = TestForm()
return render(request, 'app02_test.html', {'obj': obj})
else:
obj = TestForm(request.POST)
if obj.is_valid():
# 数据库添加数据
return redirect("/app02_index.html")
else:
return render(request, 'app02_test.html', {'obj': obj}) # 前端
<form action="/app02/test" method="POST" novalidate>
{% csrf_token %}
{{ obj.as_p }}
<p><input type="submit" value="提交"></p>
</form> 3 补充
有些浏览器会对Input首先做了验证,所以要先对form表单剔除掉浏览器的验证
<form novalidate>
3 补充ajax实现需求:数据验证+保留上次输入的值
3.1 原理:
因为ajax提交数据不会刷新页面,所以主要实现数据验证(Form实现)+ 错误信息提示
3.2 实例
- ajax提交(能验证数据 + 保留上次输入的值)
# 模板
<form action="/app02/ajax_login" method="POST" id="form1">
{% csrf_token %}
<p>
<input type="text" name="user" placeholder="用户名">
<span style="color:red;">{{ error.user.0 }}</span>
</p>
<p>
<input type="password" name="pwd" placeholder="密码">
<span style="color:red;">{{ error.pwd.0 }}</span>
</p>
<p><a onclick="submitForm();">ajax提交数据</a></p>
</form>
<script src="/static/js/jquery-1.12.4.js"></script>
<script>
function submitForm() {
$(".temp").remove();
$.ajax({
url: '/app02/ajax_login',
type: 'POST',
data: $('#form1').serialize(),
dataType: 'JSON',
success: function (arg) {
console.log(arg);
if(arg.status){ }else{
$.each(arg.msg, function (index, value) {
tag = document.createElement('span');
tag.innerHTML = value[0];
tag.style.color = 'red';
tag.className = "temp";
$('#form1').find('input[name="' + index + '"]').after(tag); }) }
}
})
}
</script> # 视图
def ajax_login(request):
if requset.method = 'GET':
return render(request, 'ajax_login.html')
else:
ret = {'status': True, 'msg': None}
obj = LoginForm(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
else:
ret['status'] = False
ret['msg'] = obj.errors
import json
return HttpResponse(json.dumps(ret))
# 可以返回render, 因为render实际就是调用HttpResponse
[oldboy-django][2深入django]Form组件功能: 数据格式验证 + 保留上次输入的值的更多相关文章
- Django框架基础之Form组件
服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息 form组件的2大功能: 1 验证(显示错误信息) 2 保留用户上次输入 ...
- django框架中的form组件的用法
form组件的使用 先导入: from django.forms import Form from django.forms import fields from django.forms impor ...
- Django学习笔记之form组件的局部钩子和全局钩子
本文通过注册页面的form组件,查看其中使用的全局钩子和局部钩子. # Create your views here. class RegForm(forms.Form): username = fo ...
- 7月2日 Django注册页面的form组件
forms.py里注册页面的form组件 # Create your views here. class RegForm(forms.Form): username = forms.CharField ...
- django 使用form组件提交数据之form表单提交
django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ...
- [oldboy-django][2深入django]初始Form组件
http://www.cnblogs.com/wupeiqi/articles/6144178.html 1 初始Form组件 # Form验证(初始Form组件验证) - 问题: - 无法记住上次提 ...
- [oldboy-django][2深入django]Form组件实现生成: select下拉框, checkbox复选框,radio单选框以及如何实现自定义数据格式要求
1 需求 - 1Form组件如何实现生成选择类标签: select,check, radio - 默认值 - 保留上次输入的值 - 2自定义验证规则 - RegexField - -
- Django 的 model form 组件
Django 的 model form 组件 Model Form 组件的由来 之前介绍过 Django 的 Form 组件(Django的Form表单)使用方法,Form 组件能够帮我们做三件事: ...
- Django中的form组件
Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...
随机推荐
- happy2018暑期集训课后习题001
根据需求补全下面的代码: 需求: 每行输入三个整数a.b.c,根据a的值不同对b和c进行不同的操作: a为0时,计算b+c a为1时,计算b-c a为2时,计算b*c a为3时,计算b/c 并输出操作 ...
- SQLyog点击“测试连接”后,报2058错误
问题:安装MySQL和SQLyog之后,在SQLyog中点击“测试连接”时,报2058错误. 解决:这里要确定两个问题:1 MySQL是否配置了环境变量:2 如果配置了MySQL环境变量,那么需要在c ...
- java算法面试题:设计一个快速排序。双路快速排序,简单易于理解。
package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Compar ...
- ORTP-0.27.0移植
注意: a. 对于0.27一下版本的ORTP的交叉编译则没有一下依赖库 b. 交叉编译工具链是: arm-linux-gnueabihf-gcc-4.9.1 (4.9版本一下的编译bctoolbox出 ...
- linux系统串口编程实例
在嵌入式开发中一些设备如WiFi.蓝牙......都会通过串口进行主机与从机间通信,串口一般以每次1bit位进行传输,效率相对慢. 在linux系统下串口的编程有如下几个步骤,最主要的是串口初始化! ...
- FILE对象线程安全
根据apue讲述: 标准的IO例程可能从它们各自的内部数据结构的角度出发,是以线程安全的方式实现的!但在线程中,如果标准 IO例程都获取它们各自的锁,那么在做一次一个字符的IO时就会出现严重的性能下降 ...
- 【数学 随机 技巧】cf364D. Ghd
随机化选讲的例题 John Doe offered his sister Jane Doe find the gcd of some set of numbers a. Gcd is a positi ...
- mysql四:数据操作
一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
- JS大小转化B KB MB GB的转化方法
function conver(limit){ var size = ""; ){ //如果小于0.1KB转化成B size = limit.toFixed() + "B ...
- python简单试题4
( ps : 题目中用到的一些random函数在最后末尾处有介绍) 1,在屏幕上显示跑马灯文字 import os # 调用os模块 import time # 调用时间模块 def main(): ...