【问题标题】:Test if Django ModelForm has instance on customized model测试 Django ModelForm 是否在自定义模型上有实例
【发布时间】:2015-11-24 06:53:02
【问题描述】:

相关问题:Test if Django ModelForm has instance

根据上面的问答,我们可以检查一个modelform是否有hasattr(form.instance, 'pk')的实例,因为instance必须有pk

我误解了相关问题。它说

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


但是在我的例子中,模型的主键被自定义为:

class MyModel(Model):
    myid = models.CharField(max_length=10, primary_key=True)
    ...

还有模型形式:

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel

在实例上具有pk 属性,在is_valid() 之后:

data = {'myid': '123'}
form = MyModelForm(data=data, instance=None)
form.is_valid()
if form.instance.pk is not None:
    print('detect: modelform received an instance')
else:
    print('detect: modelform didnt receive an instance')

我的问题是: 在这种情况下,如何检查模型表单是否使用现有实例设置?
或者,如何检查modelform的模式是“edit on existing entry”/“new entry to our DB”?

【问题讨论】:

  • pk 只是您的私钥 myid 的代理名称。它代表db中的同一个字段。
  • 您没有正确阅读链接的答案。它特别指出不要使用 hasattr,因为它总是返回 True。
  • @DanielRoseman 啊...是的,你是对的。

标签: python django


【解决方案1】:

如果您的模型具有主键列,则该模型的 pk 属性将始终存在并且是该字段的别名。

在您的情况下,您不想检查您的 form.instance 是否有一个名为 pk 的属性(即 hasattr 行)。相反,您必须检查form.instance 的属性pk 是否为空:

data = {'myid': '123'}
form = MyModelForm(data=data, instance=None)
form.is_valid()
if form.instance.pk: 
     print('This has a pk! It was saved before!')
else:
     print('This has no pk! It was never saved!')

如果它是一个尚未保存的新模型,则 form.instance.pk 字段的值将是 u''(空字符串),它在 if 语句中计算为 False,它可以满足您的需求。

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2021-12-09
    相关资源
    最近更新 更多