FORM组件

form组件

功能:

生成页面可用的HTML标签

对用户提交的数据进行校验

保留上次输入的内容

注册功能

## view视图
from django import forms

# 定义一个类  继承django中的封装好的form组件的功能
class RegForm(forms.Form):
    user = forms.CharField(label="用户名")    # label 中文标签
    pwd = forms.CharField(label="密码")
    
def reg(request):
    form_obj = RegForm()   # 实例化对象
    if request.method == 'POST':
        form_obj = RegForm(request.POST)  # 将post提交的数据传给对象
        if form_obj.is_valid():         # is_valid 数据校验是否成功,返回布尔值
            return HttpResponse('注册成功')

    return render(request, 'reg.html', {'form_obj': form_obj})
view

 

<body>
<form action="" method="post" novalidate>   {# novalidate 告诉前端不用进行校验,传到服务器进行校验,显示服务器的errors信息 #}
{% csrf_token %}
    <p>
        <label for="{{ form_obj.user.id_for_label }}">{{ form_obj.user.label }}</label>:   // id_for_label 与input框的id相同  label是view视图中user的参数
        {{ form_obj.user }} {{ form_obj.user.errors.0 }}     {# 自动生成输入框   后面是错误提示信息 #}
    </p>
    <p>
        <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>:
        {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
    </p>
    {{ form_obj.errors }}   {# 显示全部的错误信息 #}
    <button>注册</button>

</form>
</body>
模板

 

字段

CharField                   文本

ChoiceField                选择框

MultipleChoiceField        多选框

EmailField                 邮箱

IntegerField               数字

FileField                  文件

 

参数

min_length              最小长度

max_length              最大长度

required=True,          是否允许为空

label=None,             用于生成Label标签或显示内容

initial=None,           初始值 默认值

error_messages=None,    错误信息 {'required': '不能为空', 'invalid': '格式错误'}

validators=[],          自定义验证规则  在括号内写函数名称,另外另一函数进行校验

disabled=False,         是否可以编辑

widget                   HTML插件

 

widget=forms.widgets.PasswordInput     # 密文 用于密码
    widget=forms.widgets.RadioSelect       # 单选  要有choices参数
    widget=forms.widgets.SelectMultiple    # 下拉框多选
    widget=forms.widgets.CheckboxInput     # 多选
widget插件

 

校验

内置校验

在字段内设置的参数就是校验的条件 比如最大长度,最小长度,是否必填等

自定义校验

##1.写函数

from django.core.exceptions import ValidationError

def check(value):    # 指定校验器的值会传给value
     # 通过校验  不用返回
        # 没有通过校验  抛出异常
    if value == 'alex':
        raise ValidationError('有非法字符')



## 2.内置校验器

from django.core.validators import RegexValidator     # 正则校验

phone = forms.CharField(
        validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式不正确')]    #通过正则式匹配手机号,不匹配抛出异常信息

 

is_valid()流程

  1. 执行self.errors的方法 ——》 self.full_clean()

  2. full_clean方法():

    1. 定义一个存放错误信息的字典 self._errors = ErrorDict()

    2. 定义一个存放正确(经过校验)值 的字典 self.cleaned_data = {}

    3. 执行self._clean_fields():

      1. 依次循环所有的字段

      2. 执行内部的校验 和 自定义校验器的校验 value = field.clean(value)

      3. 将正确的值放在self.cleaned_data self.cleaned_data[name] = value

      4. 有局部钩子就执行

        1. 通过校验 self.cleaned_data[name] 重新赋值

        2. 不通过校验 self.cleaned_data[name] 当前字段的键值对被清除 self._errors中存放当前字段的错误信息

    4. 执行self._clean_form() ——》 self.clean()

      1. 如果有重新定义就执行

        1. 通过校验 返回所有的值 self.cleaned_data 重新赋值

        2. 不通过校验 把错误信息添加到 all 中

 

局部钩子和全局钩子

def clean_user(self):            
   # 局部钩子 针对于user
   value = self.cleaned_data.get('user')
   # 通过校验规则 返回正确的值  (可以修改返回值)
   return "{}dsb".format(value)
   # 不通过校验规则 抛出异常
   raise ValidationError('错误提示')

def clean(self):
    # 全局钩子
    pwd = self.cleaned_data.get('pwd')
    re_pwd = self.cleaned_data.get('re_pwd')
    # 通过校验规则 返回正确的值(所有的值 self.cleaned_data  )  (可以修改返回值)
    if pwd == re_pwd:
        return self.cleaned_data
    # 不通过校验规则 抛出异常
    raise ValidationError('两次密码不一致')

 

取全局钩子抛出的错:

后端获取: 实例.errors.get('__all__')

前端获取: {{ 实例.non_field_errors.0 }}

 

posted @ 2019-04-17 19:49  Sandy-123  阅读(146)  评论(0编辑  收藏  举报