zoukankan      html  css  js  c++  java
  • 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 }}

  • 相关阅读:
    01
    王天宇0703作业
    0706作业
    0705作业
    0704作业
    0703作业
    数据库死锁语句脚本
    项目问题 : 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
    工厂模式(Factory Patter)
    修改DevExpress中英文提示,将英文改为中文
  • 原文地址:https://www.cnblogs.com/sandy-123/p/10725731.html
Copyright © 2011-2022 走看看