Django-如何在ModelForm初始化中确定字段类型?
我想把模型中所有的布尔字段(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
变量绑定到实际的字段上。