Django Form组件 基于源码的扩展

1、自定义方法,验证单独某个字段

class AjaxForm(forms.Form):
username = fields.CharField()
user_id = fields.IntegerField(
widget=(
widgets.Select(choices=[(0, '张三'), (1, '李四'), (2, '王五'), ])
)
)
  
  # 通过源码可得,当字段通过正则验证后,会执行clean_字段名 的方法,并返回 self.cleaned_data[字段名]
  # 我们可以自行定义此方法,扩展form组件,以下代码,与源码执行流程一致,只是我们重新定义了
  # def clean_username(self):    
  #   return self.cleaned_data['username']  # 必须有返回值
  #
  # def clean_user_id(self):
  #   return self.cleaned_data['user_id']

  # 开始扩展,当用户名通过验证后再去验证数据库中是否有相同的用户名,如果有就发出错误信息
  
  from django.core.exceptions import NON_FIELD_ERRORS, ValidationError  # 在源码中出错会抛出一个 ValidationError 异常
  def clean_username(self): 
    v = self.cleaned_data['username']  # 只能取当前字段的值,不能取其它字段的值
    if models.UserInfo.objects.filter(username=v).count():  如果用户数大于0
      raise ValidationError('用户名已存在') 
    return self.cleaned_data['username']

 2、自定义方法,验证整体

class AjaxForm(forms.Form):
    username = fields.CharField()
    user_id = fields.IntegerField(
        widget=(
            widgets.Select(choices=[(0, '张三'), (1, '李四'), (2, '王五'), ])
        )
    )
  
  # 通过源码可得,当字段通过正则验证后,会执行clean_字段名 的方法,并返回 self.cleaned_data[字段名]
  # 我们可以自行定义此方法,扩展form组件,以下代码,与源码执行流程一致,只是我们重新定义了
  # def clean_username(self):    
  #   return self.cleaned_data['username']  # 必须有返回值 
  #
  # def clean_user_id(self):
  #   return self.cleaned_data['user_id']

  # 开始扩展,当用户名通过验证后再去验证数据库中是否有相同的用户名,如果有就发出错误信息
  
  from django.core.exceptions import NON_FIELD_ERRORS, ValidationError  # 在源码中出错会抛出一个 ValidationError 异常
  def clean_username(self): 
    v = self.cleaned_data['username']  # 只能取当前字段的值,不能取其它字段的值
    if models.UserInfo.objects.filter(username=v).count():  如果用户数大于0
      raise ValidationError('用户名已存在') 
    return self.cleaned_data['username']


  def clean(self):  # django为我们预留了这个钩子函数,当所有
clean_字段名 的方法结束后,会再执行这个函数
    value_dict = self.cleaned_date   # 获取所有通过验证的数据
    v1 = value_dict.get('username')
    v2 = value_dict.get('user_id')
    if v1 == 'root' and v2 == 1:
      raise ValidationError('整体错误信息') # 在前端取时,用__all__来取
    return self.cleaned_data
  

  def _post_clean(self):  当clean方法执行完成后,还会再执行这个方法,我们可以重写,没有返回值,一般不用
    pass

 

posted @ 2018-09-18 22:51  四十不惑的编程之路  阅读(252)  评论(0编辑  收藏  举报