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

 

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

 

前端界面:

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

 

 

前端界面:

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

 

posted @ 2018-07-06 23:57  可爱的红领巾  阅读(307)  评论(0编辑  收藏  举报