【问题标题】:Django- How to determine field types in ModelForm init?Django-如何确定 ModelForm init 中的字段类型?
【发布时间】:2014-08-29 03:13:28
【问题描述】:

我想将模型中所有 BooleanField 的小部件更改为是/否单选按钮,认为这很简单:

 def __init__(self, *args, **kwargs):
    logger.debug("%s -------" % self.__class__.__name__)
    super(FormClass,self).__init__(*args,**kwargs)
    for field in self.fields:
        logger.debug("field of type %s" % type(field))
        if type(field) == BooleanField:
            logger.debug('YES BOOLEAN')
            field.widget = RadioSelect(choices=self.TN_CHOICES)

但它什么也没做。在调试日志中,我看到每个字段类型都是str。如何确定关联模型字段类型?

【问题讨论】:

    标签: python django django-models django-forms django-widget


    【解决方案1】:

    我认为问题在于表单的fields 属性看起来就像一个字典。迭代它只会给你字段名,它们是字符串。

    不如试试

    for name, field in self.fields.items():
        ...
    

    这会将field 变量绑定到实际字段。

    【讨论】:

      【解决方案2】:

      感谢 holdenweb - 您的解决方案正在运行。与此同时,我想出了自己的替代方案

      def __init__(self, *args, **kwargs):
          super(FormClass,self).__init__(*args,**kwargs)
           for field_name in self.fields:
               if type(self.fields[field_name])==BooleanField:
                   self.fields[field_name].widget = RadioSelect(choices=self.YN_CHOICES)
      

      【讨论】:

        【解决方案3】:

        self.fields 是一个字典。当您遍历字典时,您会得到 keys,这里是字符串。你可以遍历self.fields.values() 来解决这个问题。

        但是有一个更简单的方法,那就是在模型表单的 Meta 类中使用 widgets 属性。

        【讨论】:

        • 如果你有很多不同类型的长格式字段,这不是简单的方法......
        【解决方案4】:

        使用@Lord_JABA 回答,我个人使用以下代码检查表单字段的类型(这里我检查DateField):

        def __init__(self, *args, **kwargs):
            super(FormClass, self).__init__(*args, **kwargs)
          
            
        
            for name, field in self.fields.items():
                str_representation = str(field)
                if "DateField" in str_representation:
                    # do something if the field is a DateField
        

        【讨论】:

          猜你喜欢
          • 2020-08-09
          • 2021-10-10
          • 2016-04-09
          • 2014-05-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 1970-01-01
          • 2011-02-23
          相关资源
          最近更新 更多