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 25 Python
python使用PyFetion来发送短信的例子
Apr 22 Python
Python判断变量是否已经定义的方法
Aug 18 Python
python中使用mysql数据库详细介绍
Mar 27 Python
Python 处理数据的实例详解
Aug 10 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
python 使用while写猜年龄小游戏过程解析
Oct 07 Python
python 经典数字滤波实例
Dec 16 Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 Python
BeautifulSoup获取指定class样式的div的实现
Dec 07 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
我的论坛源代码(四)
2006/10/09 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
JS 判断undefined的实现代码
2009/11/26 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
python实现的文件同步服务器实例
2015/06/02 Python
Python2.x中文乱码问题解决方法
2015/06/02 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
python Flask实现restful api service
2017/12/04 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
python标记语句块使用方法总结
2019/08/05 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
镇班子对照检查材料思想汇报
2014/09/24 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
关于感谢信的范文
2015/01/23 职场文书
律师函格式范本
2015/05/27 职场文书
公司联欢会主持词
2015/07/04 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书