【问题标题】:what is the diff between save_model and save_formset in django admindjango admin 中 save_model 和 save_formset 之间的区别是什么
【发布时间】:2013-02-18 08:09:20
【问题描述】:

我正在从这里阅读 django 管理员中的 save_modelsave_formset

https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

但我对何时调用 save_formset 感到困惑。

save_model期间不应该保存表单集吗?

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    documentation 需要澄清一下。

    • 在添加或更改期间调用save_model 以保存基本模型。它专门用于保存相关或内联模型。
    • save_relatedsave_model 完成后调用(一次)以保存所有相关/内联模型。
    • 在每次添加/更改期间,save_formset 可能会被调用多次,对于在 ModelAdmin 上定义的每个内联调用一次。它由save_related 的基类实现调用。

    如果您查看admin.ModelAdmin 的代码,您会发现save_modelsave_related 依次发生:

    class ModelAdmin(BaseModelAdmin):
        def changeform_view(...):
            # ...
            if all_valid(formsets) and form_validated:
                self.save_model(request, new_object, form, not add)
                self.save_related(request, form, formsets, not add)
    

    save_related 有一个简单的实现,可以为每个内联调用 save_formset

    class ModelAdmin(BaseModelAdmin):
        # ...
        def save_related(self, request, form, formsets, change):
            form.save_m2m()
            for formset in formsets:
                self.save_formset(request, form, formset, change=change)
    

    【讨论】:

      【解决方案2】:

      save_model 保存主模型 save_related 保存 ManyToMany 并为每个特定的内联调用 save_formset

      【讨论】:

        【解决方案3】:

        save_model 用于正在编辑的模型,即您注册 ModelAdmin 时使用的任何模型

        save_formset 用于保存表单集(ModelAdmin.inlines)

        【讨论】:

        • 那么ModelAdmin.save_related 是干什么用的
        • save_related 方法被赋予 HttpRequest、父 ModelForm 实例、内联表单集列表和一个基于是否添加或更改父级的布尔值。在这里,您可以对与父对象相关的对象执行任何保存前或保存后操作。请注意,此时父对象及其表单已被保存。
        • 根据是否添加或更改对象,为 save_model 方法提供 HttpRequest、模型实例、ModelForm 实例和布尔值。在这里您可以进行任何保存前或保存后的操作。 save_formset 方法被赋予 HttpRequest、父 ModelForm 实例和一个布尔值,基于它是添加还是更改父对象。
        • 根据您的评论,它们在我看来都一样
        猜你喜欢
        • 2011-07-25
        • 2019-07-17
        • 2020-07-18
        • 2020-09-14
        • 1970-01-01
        • 2014-10-29
        • 2012-06-12
        • 1970-01-01
        相关资源
        最近更新 更多