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 }}

  • 相关阅读:
    Asp.net 动态添加Meta标签
    【转】在SharePoint Server 2010中更改“我的网站”
    SPQuery DateTime 类型查询
    Asp.net Web Application 打开 SharePoint 2010 Site 错误 The Web application at could not be found
    How To Create SharePoint 2010 Site Collection In Its Own DB
    C# 文件打印
    面试题 java集合
    《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
    《深入理解Java虚拟机》(五)JVM调优
    《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
  • 原文地址:https://www.cnblogs.com/sandy-123/p/10725731.html
Copyright © 2011-2022 走看看