温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-05-08 15:30:46 来源:亿速云 阅读:230 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关Python中如何使用django form表单验证的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

python有哪些常用库

python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。

一. 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表单验证的方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI