一. django form表单验证引入  

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

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form</title>
</head>
<body>
<div>
<form action="url" method="post" enctype="multipart/form-data">{% csrf_token %}
<input type="text" name="username"/>
<input type="password" name="password"/>
<input type="submit" value="submit"/>
</form>
</div> </body>

前端提交后台获取:

from django.shortcuts import render,HttpResponse,redirect
from app01 import models def 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': "验证码不能为空"})

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
</head>
<body>
<div>
<form action="url" method="post" enctype="multipart/form-data">
<input type="text" name="username"/>
<input type="password" name="password"/>
<input type="text" name="code"/>
<input type="submit" value="submit"/>
</form>
</div> </body>

后台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]) 错误信息我们可以通过 模板渲染回前端页面,例
<form action="/form/" method="POST">
{% csrf_token %}
<div class="input-group">
{#接收后台传过来的form对象,自动生成input标签#}
{{ form.user }}
{#从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}
       {#如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}
{% if error.username.0 %}
<span>{{ error.userusername.0 }}</span>
{% endif %}
</div>
<div class="input-group">
{{ form.password }}
{% if error.pwd.0 %}
<span>{{ error.password .0 }}</span>
{% endif %}
</div>
<div>
<input type="submit" value="提交" />
</div>
</form>

三.自生成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})

前端页面

<body>
<form action="/form/" method="POST">
  {% csrf_token %}
<div class="input-group">
{# 接收后台传过来的form对象,自动生成input标签#}
{{ form.user }}
{# 从后台传过来的error是字典,直接{{ error.user.0 }}呈现错误信息#}
{# 如果后台返回了错误信息,将错误信息放入span标签,在页面显示,否则不显示#}
<div class="input-group">
{{ form.email }}
{% if error.email.0 %}
<span>{{ error.email.0 }}</span>
{% endif %}
</div>
<div class="input-group">
{{ form.password }}
{% if error.password.0 %}
<span>{{ error.password.0 }}</span>
{% endif %}
</div>
<div class="input-group">
{{ form.code }}
{% if error.book_type.0 %}
<span>{{ error.code.0 }}</span>
{% endif %}
</div> <div>
<input type="submit" value="提交" />
</div>
</form> </body>
</html>

四.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 forms

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': "验证码不能为空"}) 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

django form表单验证的更多相关文章

  1. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)

    一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...

  2. django form 表单验证

  3. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  4. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  5. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  6. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  7. 九 Django框架,Form表单验证

    表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. Django基础之Form表单验证

    Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...

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

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

随机推荐

  1. .Net中批量添加数据的几种实现方法比较

    在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...

  2. css优先级机制说明

    原文:css优先级机制说明 首先说明下样式的优先级,样式有三种: 1. 外部样式(External style sheet) 示例: <!-- 外部样式 bootstrap.min.css -- ...

  3. mysql基础之基本数据类型

    原文:mysql基础之基本数据类型 列类型学习 mysql三大列类型 整型 Tinyint/ smallint/ mediumint/int/ bigint(M) unsigned zerofill ...

  4. [翻译]HBase 的 MVCC 和内建的原子操作

    翻译一篇:HBase MVCC and built-in Atomic Operations 作者:Lars Hofhansl HBase 有一些特殊的原子操作: checkAndPut, check ...

  5. C#编程总结

    C#编程总结--总目录 多年的C#实战经历,希望通过一个系列课程对C#编程做系统总结. 总结过去,展望未来.新的一年,新的征程,新的开始! 希望我们在2014梦想成真,马到成功! 1.C#编程总结(一 ...

  6. Scala中的语言特性是如何实现的(3) -- Trait

    我的新博客地址:http://cuipengfei.me/blog/2013/10/13/scala-trait/ 我在Coursera上跟了一门叫做Functional Programming Pr ...

  7. linux内核数据结构之链表

    linux内核数据结构之链表 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该 ...

  8. linux extract rar files

    Extract rar-archives If you need to extract rar files in Linux, you have to download and install unr ...

  9. Event对象的事件句柄

    <html> <!-- onresize 事件会在窗口或框架被调整大小时发生 --> <!--onresize="alert('窗口的大小得到变化就会执行我') ...

  10. GCC/G++ 学习笔记

    本文是<An introduction to GCC>的学习笔记,记录使用GCC/G++主要的实用技巧,本文讲述的知识基本上摘自本书,附带自己的一些体验.如果想详细查看本书,请戳这里. 一 ...