测试Django ModelForm是否有实例

时间:2012-03-14 14:38:34

标签: django django-models django-forms

如果我进入编辑表单,我想显示一条警告消息,如果我是Django ModelForm的创建形式,则隐藏它。

form.is_bound告诉我表单是否先前已填充,但如何测试是否使用现有实例设置了ModelForm?

我试过这个hasattr(form.instance, 'pk'),但这是正确的方法吗?

干杯,

Natim

3 个答案:

答案 0 :(得分:48)

尝试检查form.instance.pk是否为None

hasattr(form.instance, 'pk')将始终返回True,因为每个模型实例都有一个pk字段,即使它尚未保存到数据库中。

答案 1 :(得分:3)

我遇到了这个问题,但就我而言,我正在使用UUID作为PK。尽管在大多数情况下可接受的答案是正确的,但是如果您未使用Django默认自动增量PK,则失败。

定义模型属性使我能够从模型,视图和模板这两个属性中访问该值作为模型的属性

@property
def from_database(self):
    return not self._state.adding

答案 2 :(得分:1)

由于现有实例将作为带有关键字instance的参数传递以创建模型表单,因此您可以在自定义初始值设定项中观察到这一点。

class Foo(ModelForm):
    _newly_created: bool

    def __init__(self, *args, **kwargs):
        self._newly_created = kwargs.get('instance') is None
        super().__init__(*args, **kwargs)