django做form表单的数据验证过程详解


Posted in Python onJuly 26, 2019

我们之前写的代码都没有对前端input框输入的数据做验证,我们今天来看下,如果做form表单的数据的验证

在views文件做验证

首先用文字描述一下流程

1、在views文件中导入forms模块

2、然后创建一个类,继承forms.form

3、然后在这个类中写变量,这个变量的就是input标签中的name,也就是前端往后端传递的k值,我们就可以对这个k值对应的v值做数据内容的校验,比如是邮箱模式,比如是否允许空,最大字段长度,最小字段长度

4、然后在视图函数中,实例化一个步骤3中的类,然后用这个对象去接受request.post中的值,然后对象就会根据post方式传递来的k值和类中的k对应,然后比较post传递过来的v值是否符合规范

1、先导入forms模块

from django import forms

2、创建模板的类

# 1、创建模板
class loginform(forms.Form):
  # 2、模板中的元素
  name = forms.CharField(min_length=6,error_messages={"requird":"用户名不能为空","min_length":"最小长度为6"})
  # requird这个是错误码
 
  email = forms.EmailField()

这里这个error_messages写出错的信息,每个不同的错误码对应不同的报错信息

3、在视图函数中使用这个类

def login(request):
  if request.method.lower() == "post":
    # 3、创建一个模板的对象,然后把数据传递个这个对象
    obj = loginform(request.POST)
 
    # 4、启动校验
 
    status= obj.is_valid()
    print(status)
 
    # 5、正确的信息
    success_dict = obj.clean()
    print(success_dict)
 
    # 6、错误的信息
    failed_dict = obj.errors.as_json()
    print(failed_dict)
    return redirect("/app1/login")
  else:
    return render(request,"login.html")

这里就会校验前台发来的数据中,k为name和email的值的合法性

因为是form表单,所以提交后页面会刷新,上次输入的数据就没有了,我们可以通过下面的方式实现保留上次输入的值

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>form提交测试</h1>
  <form method="post" action="/app1/login/">
    <p>
{#      <input type="text" name="name" placeholder="用户名">#}
{#      这段html要django帮我们生成#}
 
      {{ xx.name }}
      <span>{{ xx.error.name.0 }}</span>
    </p>
    <p>
{#      <input type="text" name="email" placeholder="邮箱">#}
      {#      这段html要django帮我们生成#}
 
 
 
      {{ xx.email }}
      <span>{{ xx.error.email.0 }}</span>
    </p>
    <p>
      <input type="text" name="pwd" placeholder="密码">
    </p>
    <input type="submit" value="submit提交">
    <input type="button" value="ajax提交" id="ajax_test1">
  </form>
  <script src="/static/jq/jquery-3.3.1.js"></script>
  <script>
    $(function () {
 
    })
 
    $("#ajax_test1").bind("click",function () {
      $.ajax({
          url:"/app1/login/",
          type:"POST",
          data:{
           name:"cui",
           email:"cui@126.com",
           pwd:"admin123."
          }
      }
      )
    })
  </script>
</body>
</html>

后端代码

from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
# Create your views here.
 
 
 
from django import forms
 
"""
def login(request):
  if request.method.lower() == "post":
    print(request.POST.get("name"))
    return redirect("/app1/login")
  else:
    return render(request,"login.html")
    # return redirect("/app1/login")
  # return HttpResponse("hahh")
"""
 
 
 
# 1、创建模板
class loginform(forms.Form):
  # 2、模板中的元素
  name = forms.CharField(min_length=6,error_messages={"required":"用户名不能为空","min_length":"最小长度为6666666666"})
  # requird这个是错误码
 
  email = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"})
 
def login(request):
  if request.method.lower() == "post":
    # 3、创建一个模板的对象,然后把数据传递个这个对象
    obj = loginform(request.POST)
 
    # 4、启动校验
 
    status= obj.is_valid()
    print(status)
 
    # 5、正确的信息
    success_dict = obj.clean()
    print("正确的信息----------->",success_dict)
 
    # 6_1、错误的信息1
    # failed_dict = obj.errors.as_json()
 
    # 6_2、错误的信息1
    failed_dict = obj.errors
 
    if not obj.is_valid():
      # print(failed_dict["name"])
      # print(failed_dict["name"][0])
      print("错误的信息----------->",failed_dict)
      print("名称的错误信息-------->",failed_dict["name"][0])
      print("邮箱的错误信息-------->", failed_dict["email"][0])
    return render(request, "login.html", {'xx': obj})
    # return redirect("/app1/login")
  else:
    obj = loginform()
    # return render(request,"login.html")
    # return redirect("/app1/login")
    return render(request,"login.html",{"xx":obj})
  # return HttpResponse("hahh")

主要是要看这里

django做form表单的数据验证过程详解

django做form表单的数据验证过程详解

#Auther Bob
#--*--conding:utf-8 --*--
 
from django import forms
from django.forms import widgets
 
class DeatilForm(forms.Form):
  # pwd = forms.CharField(widget=widgets.PasswordInput())
  # user = forms.CharField(widget=widgets.TextInput())
  pwd = forms.CharField(widget=widgets.PasswordInput(attrs={"class":"c1","placeholder":"密码"}))
  user = forms.CharField(widget=widgets.TextInput(attrs={"class":"c2","placeholder":"用户名"}))
 
  age = forms.IntegerField()
  # 这里的效果是输入框只能输入数字,其他的都无法输入
 
  choice1 = forms.ChoiceField(choices=[(1,"内蒙古"),(2,"广东"),(3,"黑龙江")])
 
  choice2 = forms.CharField(
    widget=widgets.Select(choices=[(1,"内蒙古"),(2,"广东"),(3,"黑龙江")])
  )
  choice3 = forms.IntegerField(
    widget=widgets.Select(choices=[(1,"内蒙古"),(2,"广东"),(3,"黑龙江")])
  )
  choice4 = forms.IntegerField(
    widget=widgets.RadioSelect(choices=[(1,"内蒙古"),(2,"广东"),(3,"黑龙江")])
  )
 
# 进行一下字段学习
class FiledForm(forms.Form):
  arg1 = forms.CharField(
 
    # 这个属性是charfiled特有的
    # max_length=233,最大的字符长度
    # min_length=234,最小的字符长度
 
 
 
    # 下面这些属性是filed都有的,下面参数都可以用下面的参数
 
    # required=True 是否必填
    # label=None 就是显示一个字符串,在前台渲染的时候用obj.arg1.label就会显示label的值,只是一个锦上添花的作用
    # initial=None 这里就是一个默认值,也就是初始值
    # help_text=''这里就是一个帮助信息
 
    # error_messages=None 出错的时候显示的信息
 
    # show_hidden_initial=False 是否生成带有默认值的一个隐藏的标签,可以用来判断现在的输入值和默认值是否相同
 
    # validators=() 自定义一个正则表达式
 
    # localize=False 是否支持本地化,暂时不需要掌握
 
    # disabled=False 标签是否能否能编辑
 
    # label_suffix=None 默认这个值就是冒号,也就是前面label的值和input框之间的冒号,如果设置了这个值,就会替代lable和input框中之间的冒号
 
    # error_messages=None
    # error_messages={"required":"不能为空","invalid":"格式错误",}
 
  )
  arg2 = forms.IntegerField(
    # max_value=23, 最大值
    # min_value=21. 最小值
  )
 
  arg3 = forms.FloatField(
 
  )
 
  arg4 = forms.DateField(
    # 页面必须要满足这个格式,格式是:2015-09-03
  )
 
  arg5 = forms.TimeField(
    # 页面必须要满足这个格式,格式是:11:34
  )
 
  arg6 = forms.DateTimeField(
    # 页面必须要满足这个格式,格式是:2015-09-03 11:34
  )
 
  arg7 = forms.EmailField(
 
  )
 
  arg8 = forms.PasswordInput(
 
  )
 
  arg9 = forms.RegexField(
    # 通过正则表达式自定义字段
  )
 
  arg10 = forms.FileField(
 
  )
 
  arg11 = forms.ImageField(
 
  )
 
  # 单选框
  arg12 = forms.ChoiceField(
    initial=2,
    choices=((1,"内蒙古"),(2,"黑龙江"),(3,"广东"))
  )
 
  # 多选框
  arg13 = forms.MultipleChoiceField(
    initial=[1,2],
    choices=((1,"内蒙古"),(2,"黑龙江"),(3,"广东"))
  )
 
  arg14 = forms.FilePathField(
    # recursive=False 是否递归显示,是否显示文件下的文件
 
 
    # 指定一个路径,会把这个路径下所有的文件和路径用select框显示出来
  )
 
  arg15 = forms.GenericIPAddressField(
    # 解析ip地址
  )
  arg16 = forms.SlugField(
    # 只允许输入,字母数字和下划线减号
  )
 
  arg17 = forms.UUIDField(
    # 只支持uuid格式的输入
  )
  # 这里的arg*就是k值
f8 = fields.ChoiceField(
    choices=[(1, "上海3"), (2, "北京3"), (3, "深圳3")],
    initial=3,
    required=True,
    label="城市",
    label_suffix="------>"
  )
 
  f9 = fields.TypedChoiceField(
    choices=[(1, "上海4"), (2, "北京4"), (3, "深圳4")],
    initial=3,
    required=True,
    coerce=lambda x:int(x)
  )
 
  f10 = fields.MultipleChoiceField(
    choices=[(1, "上海5"), (2, "北京5"), (3, "深圳5")],
    initial=[1,3,]
  )
 
  f11 = fields.TypedMultipleChoiceField(
    choices=[(1, "上海5"), (2, "北京5"), (3, "深圳5")],
    initial=[1, 3, ],
    coerce=lambda x:int(x),
  )
 
  f12 = fields.FilePathField(path="app1",allow_folders=True,recursive=False,allow_files=)
 
# recursive:递归显示,true不显示,false显示
# allow_folders:是否显示文件夹
# allow_files:是否显示文件
 
  f13 = fields.GenericIPAddressField(
    protocol="both"
  )
 
  f13 = fields.SlugField()
  # 只允许数字,字母,下划线,减号

widget可以指定插件的类型

django做form表单的数据验证过程详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python检测远程端口是否打开的方法
Mar 14 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 Python
python实现TF-IDF算法解析
Jan 02 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
Apr 28 Python
Python基于mysql实现学生管理系统
Feb 21 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
python:动态路由的Flask程序代码
Nov 22 Python
Python下利用BeautifulSoup解析HTML的实现
Jan 17 Python
如何使用python代码操作git代码
Feb 29 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 #Python
解决python中导入win32com.client出错的问题
Jul 26 #Python
Django CBV类的用法详解
Jul 26 #Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 #Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 #Python
django的model操作汇整详解
Jul 26 #Python
django的csrf实现过程详解
Jul 26 #Python
You might like
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
jQuery模拟点击A标记示例参考
2014/04/17 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
python 循环while和for in简单实例
2016/08/16 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
美国休闲服装品牌:Express
2016/09/24 全球购物
新年联欢会主持词
2014/03/27 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014年就业工作总结
2014/11/26 职场文书
会计主管岗位职责
2015/04/02 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
js实现上传图片到服务器
2021/04/11 Javascript
JS setTimeout与setInterval的区别
2022/04/20 Javascript