一. 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
以上所述是小编给大家介绍的Python中使用django form表单验证的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
本文向大家介绍bootstrap 表单验证使用方法,包括了bootstrap 表单验证使用方法的使用技巧和注意事项,需要的朋友参考一下 前言:做Web开发的我们,表单验证是再常见不过的需求了。友好的错误提示能增加用户体验。博主搜索bootstrap表单验证,搜到的结果大部分都是文中的主题:bootstrapvalidator。今天就来看看它如何使用吧。 一、源码及API地址 介绍它之前,还是给出它
本文向大家介绍Vue中使用vee-validate表单验证的方法,包括了Vue中使用vee-validate表单验证的方法的使用技巧和注意事项,需要的朋友参考一下 Vue项目遇到要表单验证了吧,对我来说表单验证是个很纠(dan)结(teng)的内容,各种判断凌乱到飞起。往常使用jquery的validate插件做表单验证方便吧,你也可以在Vue里引入jquery的validate插件(如何引入jq
本文向大家介绍jquery表单验证插件formValidator使用方法,包括了jquery表单验证插件formValidator使用方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了jquery表单验证插件formValidator的使用方法,供大家参考,具体内容如下 使用步骤: 1.首先在项目中添加必备js与css 2.代码中添加引用(必备引用) 3.<body>中要验证的
本文向大家介绍ionic使用angularjs表单验证(模板验证),包括了ionic使用angularjs表单验证(模板验证)的使用技巧和注意事项,需要的朋友参考一下 1什么是模板验证 顾名思义模板验证就是通过一些angularjs的属性来在html标签中验证,为了往模板驱动表单中添加验证机制,你要添加一些验证属性,就像原生的 HTML 表单验证器。 Angular 会用指令来匹配这些具有验证功能
问题内容: 页面包含如下表格。 1)如果我插入表单 validate =“ true” ,则在页面加载此表单后,将请求提交到邮件操作(此时尚未创建验证xml)。 2)创建验证xml后(与动作相同),然后向该页面的控制请求返回的动作返回404页面。 我错过了什么? 验证XML 如果我不添加验证,那么一切都会正常进行。 struts.xml 问题答案: 是Struts2提供的预定义结果之一; 基本上,
本文向大家介绍validform表单验证的实现方法,包括了validform表单验证的实现方法的使用技巧和注意事项,需要的朋友参考一下 validform插件主要把所有的验证条件和验证提示信息绑定到每个表单元素,这种形式非常方便,下面写法更加智能得到label内容来提示 validform有什么用? 网页上有大量的input需要你进行验证的时候,如果是弹窗的话,需要不停地判断,如果为空,弹窗。如果