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 formsclass 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 adminfrom django.urls import pathfrom one import viewsurlpatterns = [ path('admin/', admin.site.urls), path('add/',views.add)]
form:
from django import formsclass 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()) # 如果有一项错误的就走这个 重新输入
前端界面:
Title
自动渲染界面一:
用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())
前端界面:
渲染方式1
渲染方式2:
直接从你views内获取的对象的值而获取你的值渲染到界面中
渲染方式2
渲染方式3:
from django import formsfrom django.core.exceptions import NON_FIELD_ERRORS, ValidationErrorfrom 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内的设置全局钩子
前端:
Title
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 formsfrom django.core.exceptions import NON_FIELD_ERRORS, ValidationErrorfrom 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 #把原来的信息返回出去