form组件

Posted askzyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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了你要去除全局的错误然后对比

前端:

技术分享图片
<!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

 

以上是关于form组件的主要内容,如果未能解决你的问题,请参考以下文章

maven web项目的web.xml报错The markup in the document following the root element must be well-formed.(代码片段

django—Form组件

Django—分页器与form组件

django之forms组件

微信小程序代码片段

Django框架之Form组件