zoukankan      html  css  js  c++  java
  • Form组件

    主要功能

      1.渲染html代码
      2.校验数据
      3.展示提示信息
      校验数据,前端可有可无,但是后端必须要有
    

    基本语法

      from django import forms
      
      class MyForm(forms.Form):
            username = forms.CharField(min_length=3,max_length=8,label='用户名',error_messages={
            'min_length':'用户名最少3位',
            'max_length':'用户名最大8位',
            'required':'用户名不能为空'
            })
            password = forms.CharField(min_length=3,max_length=8)
            email = forms.EmailField(
                  error_message={
                        'invalid':'邮箱格式不正确',
                        'required':'邮箱不能为空'
                  }
            )
    

    校验数据

      # 1.将待校验的数据组织成字典的形式传入即可
      form_obj = MyForm({'username':'jason'})
      form_obj.is_valid() ## 布尔值,只有在所有数据全部合法的情况下才会返回true
      form_obj.cleaned_data ## 查看所有符合条件的数据
      form_obj.errors ## {'字段名':['出错信息']}
      # 2.校验数据只校验类中出现的字段,多传不影响校验,不会校验多传的
      # 3.少传不行
    

    渲染标签

      def index(request):
            form_obj = MyForm()
            return render(request,'',locals())
      # 前端
      ## 第一种渲染方式:代码书写极少,封装程度太高,不变扩展,测试使用
      {{ form_obj.as_p }}
      {{ form_obj.as_ul }}
      {{ form_obj.as_table }}
      ## 第二种渲染方式:可扩展性非常强,但是要书写的代码太多,一般不用
      {{ form_obj.username.label }}:{{ form_obj.username }} 
      ## 第三种渲染方式:推荐使用
      {% for form in form_obj %}
      {{ form.label }}:{{ form }}
      <span>{{ form.errors }}</span>
      {% endfor %}
    

    展示提示信息

      # 后端获取用户数据
      form_obj = MyForm() # 先产生一个空对象
      if request.method == 'POST':
      # 如何批量获取数据,并构造成字典的格式,传入校验呢?
      form_obj = MyForm(request.POST)
      # 判断数据是否合法
      if form_obj.is_valid():
            # 操作数据库,存储数据
            models.User.objects.create()
      else:
            # 获取错误信息,展示到前端
            form_obj
       """
       浏览器会自动帮你校验数据,但是前端的校验若弱不禁风
       如何让浏览器不做校验
    
       给form表单加一个novaludata
       """
    
      {% for form in form_obj %}
      {{ form.label }}:{{ form }}
      <span>{{ form.errors.0 }}</span> # 一定要点0,取值,不然会渲染成ul+li的形式
      {% endfor %}
      """
      1.必备的条件,get请求和post请求传给html页面对象的变量名必须一样
      2.forms组件当你的数据不合法的情况下,会保存你上次书写的数据,让你基于之前的数据进行修改
      """
    

    钩子函数

      """
      在特定的节点自动触发完成相应操作
    
      钩子函数在forms组件中就类似于第二道关卡,能够让我们自定义校验规则
    
      在forms组件中有两类钩子
    1.全局钩子
    	当你需要给多个字段增加校验规则的时候可以使用
    2.局部钩子
    	当你需要给单个字段增加校验规则的时候可以使用
      """
      # 实际案例
    
      # 1.校验用户名中不能含有666 局部	
      # 2.校验密码和确认密码是否一直
      from django import forms
    
      class MyForm(forms.Form):
          username = forms.CharField(min_length=3,max_length=8,label='用户名',error_messages={
              'min_length':'用户名最少3位',
              'max_length':'用户名最大8位',
              'required':'用户名不能为空'
          })
          password = forms.CharField(min_length=3,max_length=8)
          confirm_password = forms.CharField(min_length=3,max_length=8)
          email = forms.EmailField(
    	      error_messages={
                  'invalid':'邮箱格式不正确',
                  'required':'邮箱不能为空'
              }
          ) # email字段必须符合邮箱格式
          # 钩子函数
          # 局部
          def clean_username(self):
              # 获取到用户名
              username = self.clean_data.get('username')
              if '666' in username:
                  # 提示报错信息
                  self.add_error('username','666是不行的~')
                  # 将钩子函数勾出来的数据在放回去
                  return username
          # 全局
          def clean(self):
              password = self.clean_data.get('password')
              confirm_password = self.clean_data.get('confirm_password')
              if not confirm_password == password:
                  self.add('confirm_password','两次密码不一致')
              return self.clean_data
    

    forms组件参数

      label:字段名
      error_messages:自定义报错信息,字典
      initial:默认值
      required:是否必填
      """
      字段没有样式
      针对不同类型的input如何修改
      """
      widget = forms.widgets.TextInput(attrs={'class':'form-control'}) # 可以修改input框类型,text;括号内可以添加标签属性,通过字典方式
      widget = forms.widgets.PassInput(attrs={'calss':'form-control c1'}) # input
    
    
      # 第一道关卡正则验证
      phone = forms.CharField(
          validators = [
              RegexValidator(r'^[0-9]+$','请输入数字')
          ]
      )
  • 相关阅读:
    149. Max Points on a Line(js)
    148. Sort List(js)
    147. Insertion Sort List(js)
    146. LRU Cache(js)
    145. Binary Tree Postorder Traversal(js)
    144. Binary Tree Preorder Traversal(js)
    143. Reorder List(js)
    142. Linked List Cycle II(js)
    141. Linked List Cycle(js)
    140. Word Break II(js)
  • 原文地址:https://www.cnblogs.com/qijiaxun/p/14258335.html
Copyright © 2011-2022 走看看