一、Form组件原理:

django框架提供了一个form类,来处理web开发中的表单相关事项。众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证和保留用户上次输入数据的支持。

form组件有2大大功能

  对用户提交的内容进行验证(from表单/Ajax)

  保留用户上次输入的内容

form组件验证的流程

  1. obj=Form()form组件类实例化时找到类中所有的字段 把这些字段 变成组合成字典;self.fields={‘user’:正则表达式1,‘pwd’:正则表达式2}
  2. 循环self.fields字典(自己写的字段)for  k,v  in self.fields.items():,K是user,pwd,v是正则表达式
  3. 每次循环通过self.fields字典的键, 一个一个的去get前端POST提交的数据 得到用户输入数据;input_value= request.post.get(‘k’)(所以form字段的名称,要和前端的name属性匹配)
  4. 每次拿到用户输入的数据 (input_value)和进行正则表达式匹配;
  5. 匹配成功flag=True 匹配失败flag=falsh,最后 return flag  obj.is_valid=flag。如果For自带的规则和正则满足不了验证需求,可在Form类中自定义方法,做扩展。
  6. 每个字段验证通过后,每个字段执执行self.clean_filelds函数(自定义 对Form类中的字段做单独验证,比如去数据库查询判断一下用户提交的数据是否存在?)
  7. 执行Form组件的clean_form方法进行整体验证!(既然每个字段都验证了,就可以对用户提交的数据做整体验证了!比如进行联合唯一的验证)
  8. 最后执行类似 clean_form的post_clean方法结束验证。(一般不使用post_clean做自定义过滤,clean_form方法完全可以解决)

form表单提交验证

form表单(会发起 get)提交刷新失去上次内容

from django.shortcuts import render,HttpResponse,redirect
from django.forms import Form
from django.forms import fields class Login(Form):
#from验证规则 用户名 6-10字符 required不能为空
name=fields.CharField(max_length=10,
min_length=6,
required=True,
error_messages={
'required':'用户名不能为空', #error_messages参数 自定义错误信息
'min_length':'太短了',
'max_length': "太长了",
} )
# z注意name 必须和 from表单提交的一致,要么二则怎么对比校验呢
pwd= fields.CharField(min_length=3,
required=True,
error_messages={
'required': '密码不能为空', # error_messages参数 自定义错误信息
'min_length': '太短了',
'max_length': "太长了",
} ) def index(request):
if request.method=='GET':
return render(request,'login.html')
else:
obj=Login(request.POST) #把客户端提交来的form表单和 和匹配规则放在一起
res=obj.is_valid() #自动校验 给出结果 True 或者 False
if res: #验证成功后obj.cleaned_data获取成功的数据,字典类型正好对应数据 的批量操作
print(obj.cleaned_data)
return redirect('http://www.baidu.com') #obj.errors获取错误信息(对象类型)就可以传到前端显示了!
else:
return render(request,'login.html',{'obj':obj})

Aja提交验证

Ajax不会刷新,上次输入内容自动保留

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajx提交</title>
</head>
<body>
<form method="post" action="/aja_login/" id="f1">
{%csrf_token%}
<p>用户:<input type="text" name="name"></p>
<p>密码:<input type="password" name="pwd"></p>
<p><input type="button" onclick="Ajxform()" value="aja提交"></p>
</form>
</body>
<script src="/static/zhanggen.js"></script>
<script> function Ajxform(){
$('.c1').remove()
$.ajax({
url:'/alogin/',
type:'POST',
dataType:'JSON',
data:$('#f1').serialize(),
success:function (args) {
if (args.status){ }
else{
{# {status: false, msg: Object}#}
{# console.log(args);#}
{# Jquery循环服务端 传过来的 错误信息对象#}
$.each(args.msg,function (index,value) {
console.log(index,value);
{# index----> name ["太短了"]#}
{# value-----pwd["密码不能为空"]#}
var tag=document.createElement('span');
tag.innerHTML= value[0];
tag.className='c1';
console.log(index);
{# 寻找input下 属性为 name 和pwd的标签(字符串拼接) 在他们后半加 上tag标签也就是错误 信息 #}
$('#f1').find('input[name="'+ index +'"]').after(tag) })
} }})}
</script>
</html>

views

from django.shortcuts import render,HttpResponse,redirect
from django.forms import Form
from django.forms import fields
import json
class Login(Form):
#from验证规则 用户名 6-10字符 required不能为空
name=fields.CharField(max_length=10,
min_length=6,
required=True,
error_messages={
'required':'用户名不能为空', #error_messages参数 自定义错误信息
'min_length':'太短了',
'max_length': "太长了",
} )
# z注意name 必须和 from表单提交的一致,要么二则怎么对比校验呢
pwd= fields.CharField(min_length=3,
required=True,
error_messages={
'required': '密码不能为空', # error_messages参数 自定义错误信息
'min_length': '太短了',
'max_length': "太长了",}) def agx_login(request):
ret={'status':True,'msg':None}
if request.method=='GET':
return render(request,'ajalogin.html')
else:
obj=Login(request.POST)
ret['status']=False
ret['msg']=obj.errors
return HttpResponse(json.dumps(ret))

动态生成HTML标签,保留用户上次输入的内容

如何保留用户上次输入的内容?

由于form表单submit之后(发送post请求) 数据提交到 后端,不管前端输入的数据是否正确,服务端也要响应,所以页面会刷新;

所以无法保留用户上次输入的内容;如何解决呢?

  1. 把定义的定义的Form类,实例化(obj=Login() )内部调用一个__str__的方法,如果没有传值 返回<input type="text" name=“字段”>name='字段名空的input标签
  2. 把这个实例化之后的对象传到前端显示,让用户输入值;用户输入值通过post方法提交到后台。
  3. 如果后台实例化一个对象 obj=Login(request.POST)传入了值, <input type="text" name=“字段” value='request.post的数据'>然后后端再返回客户端就可以看到用户输入的值了!

保留用户上次输入的内容 是利用了 obj=Login(request.POST)接收了用户输入的值

承上启下 form组件的套路(执行流程):

(1)在后端定义类和字段,实例化Form类;

(2)到用户 发送get请求时,服务端渲染到模板(空标签/默认值)发送到客户端显示

(3)客户端填数据,POST提交到后端;

(4)后端验证,返回结果给前端;(切记Form组件是在后端生成,发送给客户端显示,客户端填完数据在发回服务端!)

Django的form,model自定制的更多相关文章

  1. Django之Form、ModelForm 组件

    Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...

  2. Django之Form

    目录 一.说明 二.参数说明 三.自定义验证规则 四.实例 一.说明 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数 ...

  3. Django 的 Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使用: 1.定义规则: from ...

  4. Python开发【Django】:Model操作(二)

    Model操作 1.操作汇总: # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj ...

  5. Django之Form详解

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 1.创建Form类.View函数处理 from ...

  6. 转载:Django之form表单

    转载: 一.使用form类创建一个表单 先定义好一个RegForm类: forms.py from django import forms # 导入forms类 class NameForm(form ...

  7. Django 之 Form 组件

    常用功能 From 组件主要有以下几大功能: 生成 HTML 标签 验证用户数据(显示错误信息) HTML Form 提交保留上次提交数据 初始化页面显示内容 小试牛刀 下面我们通过 Form 组件来 ...

  8. Django之Form与ModelForm组件

    Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...

  9. Django模型(model)系统

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  10. web框架-(六)Django补充---form表单验证

    一.form表单验证 1. 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的 ...

随机推荐

  1. Gym - 100676G Training Camp (状压dp)

    G. Training Camp[ Color: Yellow ]Montaser is planning to train very hard for ACM JCPC 2015; he has p ...

  2. mybatis中app的查询语句

    SELECT * FROM ( SELECT (@rownum := @rownum + ) AS rownum,c.* FROM (SELECT @rownum := ) r, ( select * ...

  3. 基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table

    基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table https://segmentfault.com/a/1190000015970367

  4. 打开或关闭CD_ROM

    实现效果: 知识运用: API函数 mciSendString //函数用来向媒体控制接口设备发送命令  声明如下 [DllImport("winmm.dll",EntryPoin ...

  5. Mysql 访问远程数据库,报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost

    参考:http://www.cnblogs.com/xyzdw/archive/2011/08/11/2135227.html 解决方法: 1. 改表法. 可能是你的帐号不允许从远程登陆,只能在loc ...

  6. JavaEE-07 过滤器和监听器

    学习要点 过滤器 监听器 过滤器Filter 过滤器的概念 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应. 在请求到达Servlet/JSP之前,过滤器截获请求. 在响 ...

  7. Java之字符,字符串替换

    /** 4. 字符串的替换操作 1. String replace(char oldChar,char newChar) //将新字符替换旧字符 3. String replaceFirst(Stri ...

  8. 浅谈stiring数

    在组合数学,Stirling数可指两类数,第一类Stirling数和第二类Stirling数. stirling常应用于许多组合枚举问题中. 第一类stirling数: 对第一类Stirling数   ...

  9. 7 SQL 集合运算

    7 集合运算 7-1 表的加减法 本章将会和大家一起学习“集合运算”操作.在数学领域,“集合”表示“(各种各样的)事物的总和”:在数据库领域,表示“记录的集合”.具体来说,表.视图和查询的执行结果都是 ...

  10. Linux中一些约定俗成的文件扩展名

    注:Linux中的所有内容均以文件的形式保存,但不依靠扩展名区分文件类型(根据权限区分),约定俗成的文件扩展名是为了方便管理员对文件进行区分 压缩包:“*.gz”.“*.bz2”.“*.tar.bz2 ...