[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表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...
随机推荐
- windows环境下Nginx部署及Https设置
一.Nginx安装部署及常用命令. 1.1.其实Nginx是免安装的.直接在官网下载zip包,解压即可,下载地址:http://nginx.org/en/download.html,因为我这边的开发服 ...
- 如何解析比特币中的交易原始数据rawData
交易数据结构 有关交易的详细信息可以查看比特币的wiki网站:Transaction TxBinaryMap: 原始图片地址 交易的结构表格(Transaction): 示例数据 以一个正式网络的一笔 ...
- 【洛谷2403】[SDOI2010] 所驼门王的宝藏(Tarjan+dfs遍历)
点此看题面 大致题意: 一个由\(R*C\)间矩形宫室组成的宫殿中的\(N\)间宫室里埋藏着宝藏.由一间宫室到达另一间宫室只能通过传送门,且只有埋有宝藏的宫室才有传送门.传送门分为3种,分别可以到达同 ...
- PAT (Advanced Level) Practise - 1095. Cars on Campus (30)
http://www.patest.cn/contests/pat-a-practise/1095 Zhejiang University has 6 campuses and a lot of ga ...
- KVM修改虚机网卡模式:由NAT模式改为Bridge模式
1)关闭虚机# virsh shutdown vm1 2)编辑虚机配置文件# virsh edit vm1 <interface type='default'> 改为<int ...
- JSON.parse(text[, reviver])
1. JSON.parse(text[, reviver])text 必需 有效的json字符串reviver 可选 函数 2. 举栗子1) 只有第一个参数 let objStr = '{" ...
- JQuery模拟点击页面上的所有a标签,触发onclick事件
注意: 这种方法需要给所有的a标签加上id属性 页面加载完成模拟点击所有的a标签: <script> $(function () { // 模拟点击页面上的所有a标签,触发onclick事 ...
- SpingBoot之配置文件的值注入问题
我们在这里研究的是以yml配置文件值注入的问题: Person: lastName: 张三 age: 23 boss: false birth: 2018-10-11 maps: {k1: v1,k2 ...
- 二十八、MySQL 元数据
MySQL 元数据 你可能想知道MySQL以下三种信息: 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数. 数据库和数据表的信息: 包含了数据库及数据表的结构信息. M ...
- 重置 nexus3 admin 密码
2 简单 3 重构,变化很大 如何处理nexus3忘记admin密码 - CSDN博客 https://blog.csdn.net/tianya6607/article/details/5330562 ...