Django-如何在ModelForm初始化中确定字段类型?

1 投票
4 回答
1353 浏览
提问于 2025-04-18 12:29

我想把模型中所有的布尔字段(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(字符串)。我该怎么确定对应的模型字段类型呢?

4 个回答

0

根据@Lord_JABA的回答,我个人使用了以下代码来检查表单字段的类型(这里我检查的是日期字段):

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
0

self.fields 是一个字典。当你遍历一个字典时,你得到的是它的 ,在这里这些键是字符串。你可以通过 self.fields.values() 来遍历字典的值,这样就能解决这个问题。

不过,还有一种更简单的方法,就是在模型表单的 Meta 类中使用 widgets 属性。

1

谢谢你,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

我觉得问题在于,表单的 fields 属性看起来像个字典。遍历它的时候,你只能得到字段名,这些字段名是字符串。

你可以试试这个

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

这样做会把 field 变量绑定到实际的字段上。

撰写回答