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类型

猜你喜欢

转载自www.cnblogs.com/luocongyu/p/11991606.html
56
#56