侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python中使用django form表单验证的方法

Python  /  管理员 发布于 7年前   197

一. django form表单验证引入  

有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ;

    Form      
{% csrf_token %}

前端提交后台获取:

from django.shortcuts import render,HttpResponse,redirectfrom app01 import modelsdef Login(request):  if request.method == "POST":    username = request.POST.get("username")    password = request.POST.get("password")    return HttpResponse("Hello,%s"%(username))

这样就完成了基本的功能,基本上可以用了。

但是,如果用户输入并未按照要求(比如手机号要输数据11位长度,密码的复杂度等),还有就是提交后再回来已经输入的数据也会没了

当然如果我们手动将输入之后的数据在 views 中都获取到再传递到网页,这样是可行的,但是很不方便,所以 Django 提供了更简单易用的 forms 来解决验证等这一系列的问题

,在这里不得不提Django的插件库真的很强大,简单易扩展,上面的内容只是引进为什么要使用form,下面着重记录django form的使用

二.form表单验证应用

  需要在django的APP中新建一个模块form.py,具体内容如下

class RegisterForm(forms.Form):  email = forms.EmailField(required=True,   error_messages={'required': "邮箱不能为空"})  password = forms.CharField(max_length=120,    min_length=6,    required=True,    error_messages={'required': "密码不能为空"})  invite_code = forms.CharField(required=True,error_messages={'required': "验证码不能为空"})

前端页面

    register      

后台views处理

def register(request):  if request.method == "POST":    f = Reg_Form(request.POST)    if f.is_valid():      user = f.cleaned_data["username"]      pwd = f.cleaned_data["password"]      code = f.cleaned_data["code"]      res_code = request.session.get("code", None)      result = models.UserInfo.objects.filter(user__exact=user,pwd__exact=pwd)      if code.upper() == res_code.upper() and result:        models.UserInfo.objects.filter(user__exact=user).update(status=1)        request.session["user"] = user        return redirect("/home")      else:        return render(request, "register.html", {"error": f.errors, "form": f})else:return render(request, "register.html")

Reg_Form(request.POST) 使用form类来处理提交的数据来验证数据的合法性,is_valid()合法后的逻辑处理,验证后的数据保存在实例化后返回的cleaned_data中,

cleaned_data是个字典的数据格式,错误信息保存在form.errors中比如说想在views中查看所有报错信息print(f.errors),如果只想看用户的可以

print(form.errors['username'][0])

错误信息我们可以通过 模板渲染回前端页面,例

{% csrf_token %}
{#接收后台传过来的form对象,自动生成input标签#} {{ form.user }} {#从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}       {#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#} {% if error.username.0 %} {{ error.userusername.0 }} {% endif %}
{{ form.password }} {% if error.pwd.0 %} {{ error.password .0 }} {% endif %}

三.自生成input框

Form类

class RegisterForm(forms.Form):  style = 'form-control input-lg'  phone = forms.CharField(widget=forms.TextInput(attrs={'class': style,      'name': 'title'})),  required=True,  error_messages={'required': ugettext_lazy('*Required')})  code = forms.CharField(widget=forms.NumberInput(attrs={'placeholder': '验证码',      'class': style}),  min_length=4,  max_length=4,  required=True,  error_messages={'required': ugettext_lazy('*Required')})  password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': '请输入密码',         'class': style}),    min_length=6,    required=True,    error_messages={'required': ugettext_lazy('*Required')})

views

def register(request):  if request.method == "POST":    f = RegisterForm(request.POST)    if f.is_valid():      user = f.cleaned_data["username"]      pwd = f.cleaned_data["password"]      code = f.cleaned_data["code"]      res_code = request.session.get("CheckCode", None)      result = models.UserInfo.objects.filter(user__exact=user,pwd__exact=pwd)      if code.upper() == res_code.upper() and result:        models.UserInfo.objects.filter(user__exact=user).update(status=1)        request.session["user"] = user        return redirect("/home")      else:        return render(request, "login.html", {"error": f.errors, "form": f})    else:      return render(request, "login.html", {"error": f.errors, "form": f})  else:    # 如果不是post提交数据,就不传参数创建对象,并将对象返回给前台,直接生成input标签,内容为空    f = Log_Form()    return render(request, "login.html", {"form": f})

前端页面

  
  {% csrf_token %}
{# 接收后台传过来的form对象,自动生成input标签#} {{ form.user }}{# 从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}{# 如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}
{{ form.email }} {% if error.email.0 %} {{ error.email.0 }} {% endif %}
{{ form.password }} {% if error.password.0 %} {{ error.password.0 }} {% endif %}
{{ form.code }} {% if error.book_type.0 %} {{ error.code.0 }} {% endif %}

四.Form验证完善

https://docs.djangoproject.com/en/dev/ref/forms/validation/

form验证的运行顺序是init,clean,validte,save

其中clean和validate会在form.is_valid()方法中被先后调用

clean等步骤遇到的异常:Exception Value: argument of type 'NoneType' is not iterable.

可能是cleaned_data中某个字段值应该是个列表,实际上却是空值。

clean方法重写时一定不要忘了return cleaned_data

这样重写可以使用户提交的数据在form类中执行检测完后返回数据给用户,数据合法后进行逻辑处理,不需要再进行处理返回用户,更方便更合理

补充:

5.form的四种初始化方式

①实例化oneform(initial={'onefield':value})

②定义字段时给初始化值oneformfield = forms.CharField(initial=value)

③重写Form类的__init__()方法:self.fields['onefield'].initial = value

④当给form传参instanse(即oneform(instanse=onemodel_instance))时,前三种初始化方法会全部失效,即使重写__init__时,先调用父类的__init__再使用方法③,仍然无效(不是很爽)。

这时想重新初始化字段值只能在__init__()里 self.initial['title'] = value,直接对Form类的initial属性字典赋值。

from django import formsclass RegisterForm(forms.Form):  email = forms.EmailField(required=True,   error_messages={'required': "邮箱不能为空"})  password = forms.CharField(max_length=120,    min_length=6,    required=True,    error_messages={'required': "密码不能为空"})  invite_code = forms.CharField(required=True,error_messages={'required': "验证码不能为空"})  def clean(self):    # 用户名    try:      email = self.cleaned_data['email']    except Exception as e:      raise forms.ValidationError(u"注册账号需为邮箱格式")    # 验证邮箱    user = User.objects.filter(username=email)    if user: # 邮箱已经被注册了      raise forms.ValidationError(u"邮箱已被注册")    # 密码    try:      password = self.cleaned_data['password']    except Exception as e:      print('except: ' + str(e))      raise forms.ValidationError(u"请输入至少6位密码")    return self.cleaned_data

以上所述是小编给大家介绍的Python中使用django form表单验证的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!

您可能感兴趣的文章:

  • Django ModelForm组件使用方法详解
  • 基于Django的ModelForm组件(详解)
  • django中forms组件的使用与注意
  • Django中的forms组件实例详解
  • Django forms组件的使用教程
  • 在Django的form中使用CSS进行设计的方法
  • 详解Django中的form库的使用
  • 在Django的视图中使用form对象的方法
  • 利用Django提供的ModelForm增删改数据的方法
  • Django中Forms的使用代码解析
  • Django Form 实时从数据库中获取数据的操作方法
  • Python Web框架之Django框架Form组件用法详解


  • 上一条:
    EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
    下一条:
    php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客