zoukankan      html  css  js  c++  java
  • day 56 forms组件

    day 56 forms组件

    01. forms组件作用

    1. 渲染标签
    2. 校验数据
    3. 保留信息

    02. 使用forms组件的前提

    1. 提前写好一个类

      from django import forms
      class MyForm(forms.Form):
        name = forms.CharField(label='用户名')
        pwd = forms.CharField(label='密码')
      

    03. forms组件的使用

    1. 校验数据

      def register(request):
          forms_obj = MyForms() # 为get请求渲染前端页面用
          if request.method == 'POST':
              forms_obj = MyForms(request.POST) # 将POST这个字典直接传给类
              if forms_obj.is_valid(): # 判断是否符合校验规格
                  return HttpResponse('数据全部正确')
          return render(request, 'register.html', {'forms': forms_obj})
      
      1. 向forms对象传入一个字典,key为字段名(可以多传,不能少传)
      2. 判断是否符合is_valid
      3. 查看不符合要求的字段errors
      4. 如何查看符合校验规则的数据cleaned_data
    2. 渲染前端标签

      1. 生成一个空的forms组件对象

      2. 直接将该对象传入前端

      3. 前端渲染

        1. obj.as_标签:封装程度高,不推荐项目中使用,适用于本地测试

          {{ form_obj.as_p }}
          {{ form_obj.as_ul }}
          {{ form_obj.as_table }}  <!--会自动渲染出input框-->
          
        2. obj.字段名.lable、obj.字段名。手动将其解耦

          {{ form_obj.username.label }}{{ form_obj.username }}
          {{ form_obj.password.label }}{{ form_obj.password }}
          
        3. 使用for循环

          <form action="" method="post" novalidate>
              {% for form in forms %}
                  <p>{{ form.label }}:{{ form }}{{ form.errors.0 }}</p>
              {% endfor %}
              <input type="submit">
          </form>
          
      4. 如何告诉浏览器不做校验novalidate

        <form action="" method="post" novalidate>
        
      5. 前端展示错误信息

        <span>{{ form.errors.0 }}</span>
        
    3. 字段校验

      1. 内置校验器RegexValidator(正则校验)

        from django.core.validators import RegexValidator
        
        validators=[
          RegexValidator(r'^d+$','请输入数字'),
                                       ]
        
      2. 钩子函数HOOK

        当内置的校验无法满足需求时

        1. 局部钩子

          # 用于校验单独字段
          def clean_username(self):
              value = self.cleaned_data.get('username')
              if 'i' in value:
                  self.add_error('username','包含非法字符')
              return self.cleaned_data
          
        2. 全局钩子

          # 用于多个字段联合校验
          def clean(self):
              password_value = self.cleaned_data.get('password')
              re_value = self.cleaned_data.get('re_pwd')
              if re_value != password_value:
                  self.add_error('re_pwd','密码不一致')
              return self.cleaned_data
          
    4. 字段及参数

      1. 参数

        1. label

          # 解释性说明,默认字段名
          label = '用户名' # 设定
          obj.username.label # 调用
          
        2. initial

          # input框默认值
          initial='123456' 
          
        3. error_messages

          # 重写错误信息
          error_messages={
               'required': '不能为空',
               'min_length':'太短了不好',
               'max_length':'太长了不好'}
          
        4. widget

          # 用来修改input框样式
          widget= forms.widgets.input类型({'属性名':'属性值',})
          
        5. password

          # input框的password模式 
          widget=forms.widgets.PasswordInput({'class':'form-control c1 c2','username':'jason'})
          
        6. required

          # 设置字段是否可以为空
          required=False # 默认为True不可为空
          
      2. 字段

        Field
            required=True,               是否允许为空
            widget=None,                 HTML插件
            label=None,                  用于生成Label标签或显示内容
            initial=None,                初始值
            help_text='',                帮助信息(在标签旁边显示)
            error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}
            validators=[],               自定义验证规则
            localize=False,              是否支持本地化
            disabled=False,              是否可以编辑
            label_suffix=None            Label内容后缀
         
         
        CharField(Field)
            max_length=None,             最大长度
            min_length=None,             最小长度
            strip=True                   是否移除用户输入空白
         
        IntegerField(Field)
            max_value=None,              最大值
            min_value=None,              最小值
         
        FloatField(IntegerField)
            ...
         
        DecimalField(IntegerField)
            max_value=None,              最大值
            min_value=None,              最小值
            max_digits=None,             总长度
            decimal_places=None,         小数位长度
         
        BaseTemporalField(Field)
            input_formats=None          时间格式化   
         
        DateField(BaseTemporalField)    格式:2015-09-01
        TimeField(BaseTemporalField)    格式:11:12
        DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
         
        DurationField(Field)            时间间隔:%d %H:%M:%S.%f
            ...
         
        RegexField(CharField)
            regex,                      自定制正则表达式
            max_length=None,            最大长度
            min_length=None,            最小长度
            error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'}
         
        EmailField(CharField)      
            ...
         
        FileField(Field)
            allow_empty_file=False     是否允许空文件
         
        ImageField(FileField)      
            ...
            注:需要PIL模块,pip3 install Pillow
            以上两个字典使用时,需要注意两点:
                - form表单中 enctype="multipart/form-data"
                - view函数中 obj = MyForm(request.POST, request.FILES)
         
        URLField(Field)
            ...
         
         
        BooleanField(Field)  
            ...
         
        NullBooleanField(BooleanField)
            ...
         
        ChoiceField(Field)
            ...
            choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)
            required=True,             是否必填
            widget=None,               插件,默认select插件
            label=None,                Label内容
            initial=None,              初始值
            help_text='',              帮助提示
         
         
        ModelChoiceField(ChoiceField)
            ...                        django.forms.models.ModelChoiceField
            queryset,                  # 查询数据库中的数据
            empty_label="---------",   # 默认空显示内容
            to_field_name=None,        # HTML中value的值对应的字段
            limit_choices_to=None      # ModelForm中对queryset二次筛选
             
        ModelMultipleChoiceField(ModelChoiceField)
            ...                        django.forms.models.ModelMultipleChoiceField
         
         
             
        TypedChoiceField(ChoiceField)
            coerce = lambda val: val   对选中的值进行一次转换
            empty_value= ''            空值的默认值
         
        MultipleChoiceField(ChoiceField)
            ...
         
        TypedMultipleChoiceField(MultipleChoiceField)
            coerce = lambda val: val   对选中的每一个值进行一次转换
            empty_value= ''            空值的默认值
         
        ComboField(Field)
            fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式
                                       fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
         
        MultiValueField(Field)
            PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
         
        SplitDateTimeField(MultiValueField)
            input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
            input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
         
        FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中
            path,                      文件夹路径
            match=None,                正则匹配
            recursive=False,           递归下面的文件夹
            allow_files=True,          允许文件
            allow_folders=False,       允许文件夹
            required=True,
            widget=None,
            label=None,
            initial=None,
            help_text=''
         
        GenericIPAddressField
            protocol='both',           both,ipv4,ipv6支持的IP格式
            unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
         
        SlugField(CharField)           数字,字母,下划线,减号(连字符)
            ...
         
        UUIDField(CharField)           uuid类型
        
  • 相关阅读:
    共享库的使用(.so)文件
    C/C++ 的宏中#和##的作用和展开
    有趣的打字训练
    libtool 创建库的工具
    vcpkg-微软开发的VC++打包工具
    Q他中的乱码再理解
    关于头文件和源文件的分别
    std::set 中内部元素有序条件删除的理解
    python 的 字节码 导入使用
    Pychar-20170301快捷键
  • 原文地址:https://www.cnblogs.com/luocongyu/p/11991606.html
Copyright © 2011-2022 走看看