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]+$','请输入数字')
      ]
  )
posted @ 2021-01-10 14:23  浮生一夜不知秋  阅读(87)  评论(0编辑  收藏  举报