博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
form组件
阅读量:6705 次
发布时间:2019-06-25

本文共 10105 字,大约阅读时间需要 33 分钟。

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)]
urls

 

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)
form 文件

 

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())  #  如果有一项错误的就走这个 重新输入
Views

 

前端界面:

    
Title
{
% csrf_token %}
前端界面

 

 

 

 

自动渲染界面一: 

用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())
Views

 

 

前端界面:

渲染方式1

{
% csrf_token %} {
{ form.as_p }} 就是运用as_p来设置 form是你views内传递过来的

 

 

 

渲染方式2:

 

直接从你views内获取的对象的值而获取你的值渲染到界面中

渲染方式2

{
% csrf_token %}

姓名

{
{ form.name }}

年龄

{
{ form.age }}

手机号

{
{ form.tel }}

 

 

 

渲染方式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
{
# novalidate是用来进行去除浏览器的默认设置的#} {
% csrf_token %} {
% for foo in form %}
{ # label直接就可以获取form传递过来的信息的名字不用再手动添加#} { { foo }}
{ { field.error.0 }}{ # #提取你的错误的信息渲染到这里#}{ # field就是你直接获取的字段#} {% if foo.label == 'R pwd' %}{ # 如果有错误 并且输入框是Rpwd的名字那么就执行下面的#}
{ { g_error|default_if_none:'' }}{ # 你的错误信息默认为空 有错误信息再添加错误信息#} { % endif %}
{
% endfor %}
add.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())
views

 

 

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 #把原来的信息返回出去
forms

 

转载于:https://www.cnblogs.com/zhaoyunlong/p/9275972.html

你可能感兴趣的文章
Javascript调用Webservice的多种方法 .
查看>>
让 linux 交互式命令行程序支持方向键等功能
查看>>
Linux 启动、关闭、重启网络服务
查看>>
[转载]定制CentOS 6.3 自动安装盘
查看>>
js生成动态的飘过效果
查看>>
Java进阶05 多线程
查看>>
SQLSERVER性能监控级别步骤
查看>>
Java使用ScriptEngine(javax.script)
查看>>
Nhibernate中 Many-To-One 中lazy="proxy" 延迟不起作用的原因
查看>>
C# COM Object for Use In JavaScript / HTML, Including Event Handling
查看>>
svn权限设置
查看>>
MVC验证11-对复杂类型使用jQuery异步验证
查看>>
C++static关键字用法
查看>>
excel在msdn上的说明文档
查看>>
指尖下的js ——多触式web前端开发之一:对于Touch的处理(转)
查看>>
visual studio 2013使用技巧
查看>>
Sublime Text 相关
查看>>
深入理解css优先级
查看>>
Android MediaPlayer状态机
查看>>
Material Design Animation
查看>>