form组件
Form基本使用
form是对这些进行验证的 先对你的前端的form要输入的信息进行限制 然后只要你的输入的信息满足限制的内容就会通过 不满足就不通过 就是如此的简单
类 字段 is_valid() cleaned_data errors 字段参数: max_length min_length validators = [RegexValidators("xxx")] 钩子函数 clean_字段名 注意: 必须有返回值 只能拿自己当前字段值 raise ValidationError("xxx") 下拉框数据源时时更新 1、重写init方法 先执行父类构造方法 self.fields["xx"].choices = xxxxx 2、ModelChoiceField
这个限制的条件就和定义一个类一样的和设置models一样的进行设置
注意这个文件不可以起名是forms因为forms是一个模块
form表单你可以设置两个判断条件的
你的form的类中的定义字段判断一次后 然后下面再定义钩子函数可以再进行判断
并且它内部的机制是你的对的 信息都放在cleaned_data内
错误的信息都放在了errors内 不论正确出错 信息都是以字典的键值对的形式存储的
这是成功的时候的演示 print("########## success ##########") print(form.cleaned_data) #因为成功了 信息都放在了cleaned_data内 print(form.errors) print(type(form.errors)) return HttpResponse("添加成功")
出错的演示:
这个时候出错了 信息都会存在了errors内 存的形式都是字典的形式存储的 # print("########## fail ##########") print(form.cleaned_data) # print(form.errors) # {"email":["",....]} # print(type(form.errors)) # print(form.errors.get("email")[0]) # {"email":["",....]} # print(type(form.errors.get("email"))) #
定义form设置文件
form
from django import forms class User(forms.Form): #这是定义你的要输入的信息进行匹配,你后端的信息是与这个进行匹配的 name = forms.CharField(min_length= 4) #你定义的这些字段 form默认的不能为空 age = forms.IntegerField() tel = forms.CharField(min_length=11,max_length=11)
用户验证登陆:
urls
from django.contrib import admin from django.urls import path from one import views urlpatterns = [ path('admin/', admin.site.urls), path('add/',views.add) ]
form:
from django import forms class User(forms.Form): #这是定义你的要输入的信息进行匹配,你后端的信息是与这个进行匹配的 name = forms.CharField(min_length= 4) age = forms.IntegerField() tel = forms.CharField(min_length=11,max_length=11)
from form import User #把你定义的限制条件信息导入进行 def add(request): if request.method =="POST": #如果发送的是post请求的时候就走这一步 form = User(request.POST) # 会自动把后端的input中的name对应的值给获取 然后组成键值对 然后与你的forms.Form中的内容进行对比 if form .is_valid(): #如果你的选项全部匹配成功的话就走这一步 print(form.cleaned_data) return HttpResponse('OK') else: return render(request,'add.html',locals()) # 如果有一项错误的就走这个 重新输入
前端界面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet"> <style> .container{ margin-top: 50px; } </style> </head> <body> <div class="container col-md-9 col-md-offset-2"> <form action="" method='post'> {% csrf_token %} <div class="form-group"> <label for="">姓名</label> <input type="text" name="name" class="form-control"> </div > <div class='form-group'> <label for="">性别</label> <input type="text" name="sex" class="form-control"> </div> <div class="form-group"> <label for="">年龄</label> <input type="text" name="age" class="form-control"> </div> <div class="inline-group"> <label for="">手机号</label> <input type="text" name="tel" class="form-control"> </div> <div> <input type="submit" value=" 提交"> </div> </form> </div> </body> </html>
自动渲染界面一:
用as_p方法来根据你获取到的组件内的对象而设置值
界面会跟着你的form得到的信息进行渲染 其实就是你的form组件内设置的值
views
from django.shortcuts import render,redirect,HttpResponse # Create your views here. from one .form import User #把你定义的限制条件信息导入进行 def add(request): if request.method =="POST": #如果发送的是post请求的时候就走这一步 form = User(request.POST) # 会自动把后端的input中的name对应的值给获取 然后组成键值对 然后与你的forms.Form中的内容进行对比 if form .is_valid(): #如果你的选项全部匹配成功的话就走这一步 print(form.cleaned_data) return HttpResponse('OK') else: return render(request,'add.html',locals()) # 如果有一项错误的就走这个 重新输入 form = User() #当你进去的时候先把界面给渲染出来 当你的get请求的时候你就要根据你的 form定义的内容给把界面设置出来 return render(request,'add.html',locals())
前端界面:
<h3>渲染方式1</h3> <form action="" method = 'post'> {% csrf_token %} {{ form.as_p }} 就是运用as_p来设置 form是你views内传递过来的 <input type="submit"> </form>
渲染方式2:
直接从你views内获取的对象的值而获取你的值渲染到界面中
<h3>渲染方式2</h3> <form action="" method = 'post'> {% csrf_token %} <div> <p>姓名</p> {{ form.name }} </div> <div> <p>年龄</p> {{ form.age }} </div> <div> <p>手机号</p> {{ form.tel }} </div> <input type="submit" > </form>
渲染方式3:
from django import forms from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django .forms import widgets #widgets 可以用来给字段设置前端的渲染样式 wid = widgets.TextInput(attrs={'class':'form-control'}) #把你前端要设置的样式可以通过这样设置 class User(forms.Form): #这是定义你的要输入的信息进行匹配,你后端的信息是与这个进行匹配的 name = forms.CharField( min_length= 4,max_length = 12, label = '姓名' , #可以把默认设置的为英文都设置为中文 widget = wid, error_messages = {'required':'这是一个空的字段'} #当你的信息错误的时候就会保存在error——messags内,你可以设置错误后的提示信息 error_messages最初是默认为空的 只要你输入错误才提示 ) age = forms.IntegerField(widget= widgets.NumberInput(attrs = {'class':'form-control'})) pwd = forms.CharField( widget=widgets.PasswordInput(attrs= {'class':'form-control'}) #给你的pwd内的前端设置一个input, class = form-control的样式 ) r_pwd = forms.CharField( widget = widgets.PasswordInput(attrs ={'class':'form-control'}) ) email = forms.EmailField( widget=widgets.EmailInput(attrs = {'class':'form-control'}), error_messages = {'invalid':'格式错误'} ) tel = forms.CharField(widget = wid) #添加上你的定义的渲染 #下面是对上面的规定的进一步设置 因为上面只是一个出版的设置 def clean_name(self): val = self.cleaned_data.get('name') #获取你的输入的信息 就是上的定义的条件满足的时候 就判读这个 if not val.isdigit(): #如果你的 name设置的不是数字的话 return val else: raise ValidationError('用户名不能是纯数字') def clean_tel(self): val = self.cleaned_data.get('tel') if len(val) == 11: return val else: raise ValidationError('手机号码不合适') def clean_age(self): val = self.cleaned_data.get('age') if val < 18: raise ValidationError('身份不合法不可以注册') else: return val #clean_某一个字段是这一个在字段进行的信息取值设置 def clean(self): #这个是设置全局内的判读 pwd = self.cleaned_data.get('pwd') r_pwd = self.cleaned_data.get('r_pwd') if pwd and r_pwd and pwd != r_pwd: #存在的话并且不相等 raise ValidationError('两次密码不一致') else: return self.cleaned_data #把原来的信息返回出去
用form组件实现一个登陆密码不一致提示错误信息:
这个时候就用到了全局错误信息 cleaned_date了你要去除全局的错误然后对比
设置全局判断信息:clean
#clean_某一个字段是这一个在字段进行的信息取值设置 def clean(self): #这个是设置全局内的判读 pwd = self.cleaned_data.get('pwd') r_pwd = self.cleaned_data.get('r_pwd') if pwd and r_pwd and pwd != r_pwd: #存在的话并且不相等 raise ValidationError('两次密码不一致') else: return self.cleaned_data #把原来的信息返回出去 因为正确的信息都放在了cleaned_data内
取全局错误信息:__all__
g_error = form .errors.get('__all__') #获取form内的设置全局钩子
前端:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet"> <style> .container{ margin-top: 50px; } .error{ color: red; } </style> </head> <body> <div class="container col-md-9 col-md-offset-2"> <div> <div> <div> <form action="" method="post" novalidate> {# novalidate是用来进行去除浏览器的默认设置的#} {% csrf_token %} {% for foo in form %} <div class="form-group"> <label for=""> {{ foo.label }}</label> {# label直接就可以获取form传递过来的信息的名字不用再手动添加#} {{ foo }} <span>{{ field.error.0 }}</span> {# #提取你的错误的信息渲染到这里#} {# field就是你直接获取的字段#} {% if foo.label == 'R pwd' %} {# 如果有错误 并且输入框是Rpwd的名字那么就执行下面的#} <span class="pull-right error"> {{ g_error|default_if_none:'' }}</span> {# 你的错误信息默认为空 有错误信息再添加错误信息#} {% endif %} </div> {% endfor %} <input type="submit" class="btn btn-default btn-sm pull-right" > </form> </div> </div> </div> </div> </body> </html>
views:
from django.shortcuts import render,redirect,HttpResponse # Create your views here. from one .form import User #把你定义的限制条件信息导入进行 def add(request): if request.method =="POST": #如果发送的是post请求的时候就走这一步 form = User(request.POST) # 会自动把后端的input中的name对应的值给获取 然后组成键值对 然后与你的forms.Form中的内容进行对比 if form .is_valid(): #如果你的选项全部匹配成功的话就走这一步 print(form.cleaned_data) return HttpResponse('OK') else: g_error = form .errors.get('__all__') #获取全局错误 if g_error: #如果你的 全局错误有的话 g_error = g_error[0] #取第一个 return render(request,'add.html',locals()) # 如果有一项错误的就走这个 重新输入 form = User() #当你进去的时候先把界面给渲染出来 当你的get请求的时候你就要根据你的 form定义的内容给把界面设置出来 return render(request,'add.html',locals())
forms组件:
from django import forms from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django .forms import widgets #widgets 可以用来给字段设置前端的渲染样式 wid = widgets.TextInput(attrs={'class':'form-control'}) #把你前端要设置的样式可以通过这样设置 class User(forms.Form): #这是定义你的要输入的信息进行匹配,你后端的信息是与这个进行匹配的 name = forms.CharField( min_length= 4,max_length = 12, label = '姓名' , #可以把默认设置的为英文都设置为中文 widget = wid, error_messages = {'required':'这是一个空的字段'} #当你的信息错误的时候就会保存在error——messags内,你可以设置错误后的提示信息 error_messages最初是默认为空的 只要你输入错误才提示 ) age = forms.IntegerField(widget= widgets.NumberInput(attrs = {'class':'form-control'})) pwd = forms.CharField( widget=widgets.PasswordInput(attrs= {'class':'form-control'}) #给你的pwd内的前端设置一个input, class = form-control的样式 ) r_pwd = forms.CharField( widget = widgets.PasswordInput(attrs ={'class':'form-control'}) ) email = forms.EmailField( widget=widgets.EmailInput(attrs = {'class':'form-control'}), error_messages = {'invalid':'格式错误'} ) tel = forms.CharField(widget = wid) #添加上你的定义的渲染 #下面是对上面的规定的进一步设置 因为上面只是一个出版的设置 def clean_name(self): val = self.cleaned_data.get('name') #获取你的输入的信息 就是上的定义的条件满足的时候 就判读这个 if not val.isdigit(): #如果你的 name设置的不是数字的话 return val else: raise ValidationError('用户名不能是纯数字') def clean_tel(self): val = self.cleaned_data.get('tel') if len(val) == 11: return val else: raise ValidationError('手机号码不合适') def clean_age(self): val = self.cleaned_data.get('age') if val < 18: raise ValidationError('身份不合法不可以注册') else: return val #clean_某一个字段是这一个在字段进行的信息取值设置 def clean(self): #这个是设置全局内的判读 pwd = self.cleaned_data.get('pwd') r_pwd = self.cleaned_data.get('r_pwd') if pwd and r_pwd and pwd != r_pwd: #存在的话并且不相等 raise ValidationError('两次密码不一致') else: return self.cleaned_data #把原来的信息返回出去