Django Forms组件以及知识总结

家住魔仙堡 提交于 2020-03-13 13:11:08


Forms组件

一、Form组件介绍

Form组件可以做的几件事情:

  1、用户请求数据验证

  2、自动生成错误信息    

  3、打包用户提交的正确信息

  4、如果其中有一个错误了,其他的正确这,保留上次输入的内容

  4、自动创建input标签并可以设置样式

 

二、Form组件的使用

  1、创建规则

from django import  forms
from django.forms import widgets
from  app01.models import *
from  django.forms import ValidationError  #下面的import和这里效果一样
# from django.core.exceptions import ValidationErrorclass UserForm(forms.Form):
    name = forms.CharField(min_length=4,label='用户名',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.TextInput(attrs={'class':'form-control'}))
    pwd =forms.CharField(min_length=8,label='密码',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.PasswordInput(attrs={'class':'form-control'}))
    r_pwd =forms.CharField(min_length=8,label='确认密码',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.PasswordInput(attrs={'class':'form-control'}))
    tel = forms.CharField(label='手机号码',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.TextInput(attrs={'class':'form-control'}))
    email =forms.EmailField(label='邮箱',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.TextInput(attrs={'class':'form-control'}))

2.规则匹配

error_messages={'错误字段':'提示信息'}

widget=widgets.TextInput(attrs={'class':'form-control'}):给text类型的input框添加一个class属性,值为form-control

widgets.PasswordInput:表示密码输入框.

def clean_字段名:局部校验钩子,针对某一个字段编写校验规则.

def clean(self):全局校验钩子,可以取出所有的字段值,进行校验.用于校验2个字段的值是否相同(校验密码与确认秘密).

self.cleaned_data:是在全局校验中,所有的干净数据(已经通过校验的数据).

myforms.py文件:

# *_*coding:utf-8 *_*
from django import  forms
from django.forms import widgets
from  app01.models import *
from  django.forms import ValidationError  #下面的import和这里效果一样
# from django.core.exceptions import ValidationError
class UserForm(forms.Form):
    # 这个类里的属性名必须和前端中form表单中name属性值一致
    # 校验时,如果有任意一个不符合规则,就false

    '''
    error_messages={'错误类型':'错误提示'}
    widgets.TextInput(attrs={'属性名':'属性值'})
    '''
    name = forms.CharField(min_length=4,label='用户名',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.TextInput(attrs={'class':'form-control'}))
    pwd =forms.CharField(min_length=8,label='密码',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.PasswordInput(attrs={'class':'form-control'}))
    r_pwd =forms.CharField(min_length=8,label='确认密码',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.PasswordInput(attrs={'class':'form-control'}))
    tel = forms.CharField(label='手机号码',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.TextInput(attrs={'class':'form-control'}))
    email =forms.EmailField(label='邮箱',error_messages={'required':'该字段不能为空!'},
                           widget=widgets.TextInput(attrs={'class':'form-control'}))

    # 局部钩子
    def clean_name(self):
        val = self.cleaned_data.get('name')
        is_true = userinfo.objects.filter(name=val)
        if is_true:
            raise  ValidationError('该用户已经存在!')
        else:
            return val

    def clean_tel(self):
        val =self.cleaned_data.get('tel')
        if len(val)==11 and val.startswith('1'):
            return val
        else:
            raise ValidationError("手机号码格式不对,必须是1开头")
#     全局钩子
    def clean(self):
        pwd =self.cleaned_data.get('pwd')
        r_pwd =self.cleaned_data.get('r_pwd')
        # 校验密码时,如果pwd或者r_pwd,校验规则时不通过的话,那么就不应该让它俩进行比对.校验不通过值是none
        if pwd and  r_pwd:
            if pwd==r_pwd:
                return self.cleaned_data
            else:
                raise  ValidationError('两次密码不一致')
        else:
            return self.cleaned_data
views.py:校验逻辑代码

form =UserForm(request.POST):所有的请求数据都在POST中,先实例化一个对象

is.valid():这个是用来进行校验的

from django.shortcuts import render,HttpResponse
from app01.myforms import *
# Create your views here.
def reg(request):
    if request.method=="POST":

        print(request.POST)
        form = UserForm(request.POST)
        #  form.is_valid() 是校验结果,如果校验通过返回true,否则返回false
        print(form.is_valid())
        if form.is_valid():
            # form.cleaned_data:通过后的数据,是一个字典形式.{'key':value}
            print(form.cleaned_data)
            return  HttpResponse('验证通过')
        else:
            # form.cleaned_data:出现在校验失败的逻辑中,则表示校验成功的字段信息.
            print(form.cleaned_data)
            # form.erros:返回的校验不通过的信息,格式为:{'不通过的字段':[不通过原因]}
            # 取全局错误
            errors = form.errors.get('__all__')
            print(errors)
            print(form.errors)
            for i in form.errors:
                print(form.errors.get(i)[0])#获取错误信息

            '''校验失败返回页面:
            此次返回的页面和get请求不一样,get请求中form中是没有数据的.这次返回的form中有数据,那么会自动渲染数据
            这样的好处就是,填写的数据不会被清空,而是被渲染到标签中     
            '''
            return render(request, 'reg.html', locals())

    form = UserForm()

    return  render(request,'reg.html',locals())
reg.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>forms表单校验</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


</head>
<body>


<div class="cent" style="width: 30%;margin: 0 auto">
    <h3>forms组件渲染form表单2</h3>
    <form action="" method="post">
        {% csrf_token %}
        {% for foo in form %}
            <div style="margin: 5px "><label for="">{{ foo.label }}</label> {{ foo }}
                <span style="color:red" class="pull-right">{{ foo.errors.0 }}</span>
                {% if errors.0 and foo.name == 'r_pwd' %}  用来判断全局错误中,是否是确认密码的错误提示.
                    <span style="color:red" class="pull-right">{{ errors.0 }}</span>
                {% endif %}

            </div>

        {% endfor %}

        <input type="submit">
    </form>
</div>

</body>
</html>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!