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]+$','请输入数字')
          ]
      )
  • 相关阅读:
    数组的拼接
    numpy的切片和索引
    细说python中的round()方法
    Numpy数组的创建
    快排 [随机数]
    对于归并排序递归的理解
    A1044 Shopping in Mars [连续子序列分割]
    A1085 Perfect Sequence [二分、two pointers]
    快速幂
    [转] 二分法求外接圆最大半径
  • 原文地址:https://www.cnblogs.com/qijiaxun/p/14258335.html
Copyright © 2011-2022 走看看