如果列表中的所有模型表单字段都设置了值,我的代码应该为True。如果没有回答一个或多个表单字段,则应该给我错误。
到目前为止,我有这个:
fields_list = [field1, field2, field3]
if all(field != "" for field in fields_list) is True:
return True
else:
return False
这适用于简单的CharFields,例如:
field1 = models.CharField('Field1', max_length=255, blank=True, null=True)
但是对于具有预定义选择的CharField似乎不起作用:
CHOICES = (
('yes', 'yes'),
('no', 'no'),
)
field2 = models.CharField('Field2', choices=CHOICES, max_length=255, blank=True, null=True)
它似乎不适用于DateFields等。
有人可以帮我找出如何检查各种模型表单字段吗?
答案 0 :(得分:1)
我尝试了很多东西。最后,这个简单的解决方案似乎有效:
fields_list = [field1, field2, field3]
if any(field is None or field == '' for field in fields_list) is True:
return False
else:
return True
答案 1 :(得分:1)
虽然OP的答案朝着正确的方向发展,但我需要对其进行一些调整以使其正常工作,并考虑模型中的所有字段,而无需手动列出它们。这是我想出的:
class MyModel(models.model)
# long list of fields here..
def is_fully_filled(self):
''' Checks if all the fields have been filled '''
fields_names = [f.name for f in self._meta.get_fields()]
for field_name in fields_names:
value = getattr(self, field_name)
if value is None or value == '':
return False
return True
如果您需要将此值存储为数据库中的计算属性(每次更改列表中的字段时都会自动更新),可以使用django-computed-property轻松完成:
class MyModel(models.model)
# long list of fields here..
fully_filled = computed_property.ComputedBooleanField(
compute_from='is_fully_filled', default=False)
def is_fully_filled(self):
''' Checks if all the fields have been filled '''
fields_names = [f.name for f in self._meta.get_fields()]
for field_name in fields_names:
if field_name == 'fully_filled':
continue # avoid recursive calls to is_fully_filled
value = getattr(self, field_name)
if value is None or value == '':
return False
return True