zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    WCF学习资料
    浅谈Configure和Setting
    面向对象的设计原则与目标[总结篇]
    异步调用与线程(总结篇)
    博客园“图灵微软名著杯博问大赛”
    《Flex 3权威指南》——Adobe官方培训教材
    Google和Yahoo专家眼中的JavaScript设计模式
    拥抱iPhone,拥抱软件开发的未来 ——转帖:中华读书报
    iPhone开发:抢先拥抱软件开发的未来
    jQuery之父强烈推荐之jQuery实战
  • 原文地址:https://www.cnblogs.com/dangrui0725/p/9671886.html
Copyright © 2011-2022 走看看