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中的__slots__使用示例
Feb 26 Python
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
Python+PyQt5+MySQL实现天气管理系统
Jun 16 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
python获取字符串中的email
Mar 31 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
PHP 采集程序中常用的函数
2009/12/09 PHP
PHP安全性漫谈
2012/06/28 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
Yii框架安装简明教程
2020/05/15 PHP
js查找父节点的简单方法
2008/06/28 Javascript
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
Javascript实现计算个人所得税
2015/05/10 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
pywinauto自动化操作记事本
2019/08/26 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
超市中秋节促销方案
2014/03/21 职场文书
签约仪式策划方案
2014/06/02 职场文书
道歉的话语大全
2015/05/12 职场文书
酒店员工手册范本
2015/05/14 职场文书
植树节新闻稿
2015/07/17 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
如何使用python包中的sched事件调度器
2022/04/30 Python