一. django form表单验证引入
有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ;
Form
前端提交后台获取:
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': "验证码不能为空"})
前端页面
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])
错误信息我们可以通过 模板渲染回前端页面,例
三.自生成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})
前端页面