Form组件

介绍

我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.

Django form组件就实现了上面所述的功能。

总结一下,其实form组件的主要功能如下:

  • 生成页面可用的HTML标签 --->渲染页面(生成HTML标签功能)
  • 对用户提交的数据进行校验 --->校验数据(对用户提交的数据进行校验,并返回校验结果)
  • 保留上次输入内容 --->展示信息( 当用户输错之后 再次输入 上次的内容还保留在input框)


如何使用Form组件

先定义一个RegForm类

views.py  检验数据

def login(request):
    # 1  先生成一个空的类对象
    form_obj = MyRegForm()
    if request.method == 'POST':
        # 3  实例化form对象的时候,把post提交过来的数据交给forms组件校验  request.POST
        form_obj = MyRegForm(request.POST)
        # 4  获取校验结果
        if form_obj.is_valid():
            return HttpResponse('格式正确')
        else:
            # 5 获取校验失败的字段和提示信息
            print(form_obj.errors)
    # 2  直接将该对象传给前端页面
    return render(request, 'login.html', locals())


from django import forms

class MyRegForm(forms.Form):
    # 用户名最多9位,最少4位
    username = forms.CharField(max_length=9, min_length=4)
    password = forms.CharField(max_length=9, min_length=4)
    # email字段控制了input输入框必须为邮箱格式
    email = forms.EmailField()

login.html

{#form表单取消前端浏览器自动校验功能   novalidate #}
<form action="" method="post" novalidate> 
    {% for form in form_obj %}
    <p>
        {{ form.label }}{{ form }}
        <span>{{ form.errors.0 }}</span>
    </p>
    {% endfor %}
    <input type="submit">
</form>

检验数据

校验数据,即获取前端的输入,并根据类中定义该标签时的参数进行校验,根据校验结果处理响应

1、后端实例化一个空的对象form_obj,交给前端渲染成form表单

2、前端form表单提交数据,数据格式是字典

3、数据字典传给类,实例化生成一个对象,与1中的空对象同名form_obj

4、根据对象form_obj的校验结果返回响应数据

通过对象绑定方法is_valid判断数据校验结果是否通过

只有所有数据校验通过的情况下,is_valid才为True

内部的数据处理逻辑:

从类MyForm定义的字段中,依次去数据字典中比对

若字典中存在同名的key,那么按照字段的参数条件去校验数据字典中key对应的value,不存在就将错误描述加入到form_obj.errors字典中

比对之后,若value符合要求,则加入到form_obj.cleaned_data字典中,若不符合要求,则将错误描述加入到form_obj.errors字典中

比对完所有的类MyRegForm定义的字段后,结束比对,因此,数据字典多余的数据不会影响校验结果

form_obj.errors中,每一个value值都是一个列表,因为每一个字段都可能有多个约束条件

内置校验器

from django.core.validators import RegexValidator
from django import forms
class MyForm(forms.Form):
    user = forms.CharField(
        validators=[
        RegexValidator(r'^[0-9]+$', '请输入数字'), 
        RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
    )

Form常用字段

initial

初始值,input框里面的初始值

class MyRegForm(forms.Form):
    # 用户名最多9位,最少4位
    username = forms.CharField(max_length=9, min_length=4,
                               label='用户名:',
                               initial= 'Santa',
                               )
    password = forms.CharField(max_length=9, min_length=4, label='密码:')
    # email字段控制了input输入框必须为邮箱格式
    email = forms.EmailField()

error_messages

重写错误信息

class MyRegForm(forms.Form):
    # 用户名最多9位,最少4位
    username = forms.CharField(max_length=9, min_length=4,
                               label='用户名:',
                               initial= 'Santa',
                               error_messages={
                                   'max_length': "用户名最长9位",
                                   'min_lengyh': "用户名最短4位",
                                   'required': "用户名不能为空",
                                   'invalid': "格式错误"
                               })

password

密文

password = forms.CharField(max_length=9, min_length=4, label='密码:',
                           widget=forms.widgets.PasswordInput(
                               {'class': 'c1'}, render_value=True
                           ))  # 以attrs={key:value}的方式设置标签属性

required

是否为空

class MyRegForm(forms.Form):
    username = forms.CharField(max_length=9, min_length=4,
                               error_messages={
                                   'required': "用户名不能为空",
                                   'invalid': "格式错误"
                               })

CheckboxInput:单选按钮

CheckboxSelectMultiple:多选按钮

RadioSelect:单选框

Select:下拉单选框

SelectMultiple:下拉多选框

class MyForm(forms.Form):
    username = forms.CharField(
        max_lenget=8,
        min_length=3,
        widget=forms.widgets.TextInput(attrs={"class": "form-control"})  # 文本输入框,默认
        widget=forms.widgets.PasswordInput(attrs={"class": "form-control"})   # 密文输入框       
    )


钩子函数

全局钩子(针对多个字段)

校验密码与确认密码是否一致

在MyForm中定义clean()方法,实现对字段的全局校验

class MyRegForm(forms.Form):
    ...
	# 全局钩子
    def clean(self):
        password = self.cleaned_data.get('password')
      # cleaned_data 查看校验通过的数据
    confirm_password  = self.cleaned_data.get('confirm_password')
    if not password == confirm_password:
        self.add_error('confirm_password', '两次密码不一致')
        return self.cleaned_data


局部钩子(针对单个字段)

检验用户中不能包含敏感词

在MyForm中定义clean_字段名()方法,实现对特定字段的校验

class MyRegForm(forms.Form):
    ...
	# 局部钩子
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if '666' in username:
            self.add_error('username', '不能带666')
            return username


 posted on 2020-01-13 23:02  Rannie`  阅读(184)  评论(0编辑  收藏  举报
去除动画
找回动画