Django Form组件

Django Form组件

form组件

  1. form表单完成的事情

  2. 自动写input框

  3. 对提交的数据进行校验

  4. 提供错误提示

  5. 定义form组件

from django import forms


class RegForm(forms.Form):
   username = forms.CharField(label='用户名')
   pwd = forms.CharField(label='密码')
  1. 使用

视图中:

form_obj = RegForm()   # 实例化form对象
return render(request, 'register.html', {'form_obj': form_obj})

模板中:

form 标签加上novalidate 前端不进行校验

{{ form_obj.as_p }}   ——》  生成所有的p标签   label  input

{{ form_obj.errors }}   ——》所有字段的错误

{{ form_obj.user }}   ——》 该字段的input框
{{ form_obj.user.label }}   ——》 该字段的label  中文提示
{{ form_obj.user.id_for_label }}   ——》 该字段的id
{{ form_obj.user.errors }}   ——》 该字段的所有的错误信息
{{ form_obj.user.errors.0 }} ——》 该字段的第一个的错误信息

字段和参数

常用的字段

​ CharField input

​ ChoiceField select框
MultipleChoiceField 多选框

常用插件

创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

forms.widgets.PasswordInput  密码框
forms.widgets.RadioSelect   radio单选
forms.widgets.Select        select单选
forms.widgets.SelectMultiple    select多选
forms.widgets.CheckboxInput    check单选
forms.widgets.CheckboxSelectMultiple    check多选

字段的参数:

required=True,               是否允许为空
widget=None,                 HTML插件
label=None,                  用于生成Label标签或显示内容
initial=None,                初始值    
error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}
validators=[],               自定义验证规则
disabled=False,              是否可以编辑

示例代码

from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator


def check(value):
    if 'aa' in value:
        raise ValidationError('敏感词汇!!')
    # return value


class MyForm(forms.Form):
    username = forms.CharField(
        label='用户名',
        min_length=8,
        initial='张三',
        required=True,
        # disabled=True,
        # validators=[check, ],
        error_messages={
            'required': '不能为空',
            'invalid': '格式错误',
            'min_length': '最短8位'
        }
    )

    pwd = forms.CharField(
        label='密码',
        widget=forms.PasswordInput()
    )
    re_pwd = forms.CharField(
        label='确认密码',
        widget=forms.PasswordInput()
    )

    phone = forms.CharField(
        label='手机号',
        required=True,
        validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式不正确!')]
    )
    gender = forms.fields.ChoiceField(
        choices=((1, '男'), (2, '女'), (3, '保密')),
        label='性别',
        initial=1,
        widget=forms.widgets.RadioSelect()

    )

    hobby = forms.fields.MultipleChoiceField(
        choices=((1, '吃'), (2, '玩'), (3, '睡')),
        label='爱好',
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()

    )

    def clean_username(self):
        value = self.cleaned_data.get('username')
        if 'bb' in value:
            raise ValidationError('敏感词汇!!!!')
        return value

    def clean(self):
        pwd = self.cleaned_data.get('pwd')
        re_pwd = self.cleaned_data.get('re_pwd')
        if pwd != re_pwd:
            self.add_error('re_pwd', '两次密码不一致!')
            raise ValidationError('两次密码输入不一致')
        return self.cleaned_data

校验

校验流程
0. 校验开始 form_obj.is_valid()

  1. 内置校验,self.validate(value)
  2. 自定义校验,self.run_validators(value)
  3. 局部钩子校验,if hasattr(self, 'clean_%s' % name):
  4. 全局钩子校验,self._clean_form() -》 self.clean()
  5. 获取数据,form_obj.cleaned_data

内置校验

校验 required=True,min_length=8,max_length=12,

源码示例:

def validate(self, value):
    if value in self.empty_values and self.required:
        raise ValidationError(self.error_messages['required'], code='required')

自定义校验(自定义校验器)

第一种

from django.core.exceptions import ValidationError

def check(value):
    if 'aa' in value:
        raise ValidationError('敏感词汇!!')
    # return value
    
    
validators=[check]
    

第二种

from django.core.validators import RegexValidator

validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式不正确!')]

局部钩子

定义一个方法 clean_字段名(self,)的方法,如果不通过校验规则,要抛出异常ValidationError,如果通过校验规则,返回通过校验的值
用于校验单个字段

def clean_username(self):
    value = self.cleaned_data.get('username')
    if 'bb' in value:
        raise ValidationError('敏感词汇!!!!')
    return value

全局钩子

定义一个方法 clean(self)的方法,如果不通过校验规则,要抛出异常ValidationError,还可以自己使用self.add_error('re_pwd', '两次密码不一致!')添加错误信息。如果通过校验规则,返回所有通过校验的值
用于校验多个字段或联合字段

def clean(self):
    pwd = self.cleaned_data.get('pwd')
    re_pwd = self.cleaned_data.get('re_pwd')
    if pwd != re_pwd:
        self.add_error('re_pwd', '两次密码不一致!')
        raise ValidationError('两次密码输入不一致')
    return self.cleaned_data

posted @ 2019-08-03 17:00  写bug的日子  阅读(126)  评论(0编辑  收藏  举报