Django:检查模型字段是否得到应答

时间:2015-04-14 13:23:52

标签: python django django-forms django-orm

如果列表中的所有模型表单字段都设置了值,我的代码应该为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等。

有人可以帮我找出如何检查各种模型表单字段吗?

2 个答案:

答案 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