【问题标题】:Django ModelForm is_valid saves the instance automaticallyDjango ModelForm is_valid 自动保存实例
【发布时间】:2012-08-31 21:42:40
【问题描述】:

我发现 Django 中的 ModelForm 非常易于使用,它节省了大量的开发时间。

但是,当我意识到 is_valid 实际上保存了 ModelForm 时,我被卡住了!我想知道这是预期的行为,还是我做错了什么?

发生在我身上的是

    form=SOME_MODEL_FORM(...., instance=cafe)
    print cafe.name # "CAFE OLD NAME"
    if request.method="POST":
        if form.is_valid():
            ### HERE the cafe instance has been changed
            print cafe.name # "CAFE NEW NAME"

我用post_save调试,is_valid确实保存了模型!

我目前的解决方法是在调用 is_valid 之前将模型保存在另一个对象中,然后保存回来以覆盖 chang。这真的是黑客行为,我希望有一种更优雅的方式来实现相同的目标(在 is_valid 调用之后不保存模型)。

谢谢!

【问题讨论】:

    标签: django modelform


    【解决方案1】:

    form.is_valid() 不保存表单,它只是检查验证,顾名思义。

    看这里https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.is_valid

    在此处阅读模型表单中的 is_valid 方法 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-is-valid-method-and-errors

    【讨论】:

    • 很遗憾,这不是真的,@Rohan 明白了这一点,这正是我想讨论的内容。
    【解决方案2】:

    form.is_valid() 不会将新数据保存在 DB 中。但是,它会使用新属性更新实例对象,以便在您调用form.save() 时可以使用它们。

    您可以通过以下方式验证这一点:

    >>> mc = MyModel.objects.get(id=3)
    >>> mf=MyModelForm({'name': 'abcd'}, instance=mc)
    >>> mc.name
    u'oldName'
    >>> mf.is_valid()
    True
    >>> mc.name
    u'abcd'
    >>> mc2 = MyModel.objects.get(id=3)  #get the new instance from DB
    >>> mc2.name
    u'OldName'
    >>> 
    

    【讨论】:

    • 感谢 Rohan,是的,对 is_valid 的调用实际上更新了现有模型,但有什么办法可以避免这种默认行为?我想在更新模型之前执行一次完整性检查。
    • @zhaocong,健全性检查可以在表格或模型中进行clean()方法。
    • 好吧,这对我来说是新的。感谢罗汉。我需要更多信息。 Rohan,我正在查看这里的源代码,找不到这件事到底是在哪里完成的,你能告诉我(django 源代码中的行号和文件)吗?
    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 2020-01-02
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2017-06-29
    • 2014-01-14
    • 2012-07-23
    相关资源
    最近更新 更多