【问题标题】:Ignore inline model when saving保存时忽略内联模型
【发布时间】:2017-07-06 12:22:05
【问题描述】:

我一直在查看文档和 stackoverflow/forums,以便在将模型保存在 django admin 中时忽略它的内联子项。我一直在寻找几天,我似乎无法找到答案。

我有一个普通的 tabularinline 对象:

class UserOrdersAdmin(admin.TabularInline):
    model = Order
    classes = ['collapse']

和一个普通的用户管理员注册:

class UserAdmin(BaseUserAdmin):
    inlines = (UserOrdersAdmin, UserSettingsAdmin)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

我想要的是当我在用户“更改视图”中按保存时,它将忽略与 UserAdmin 内联的内联“UserOrderAdmin”。

【问题讨论】:

  • 从问题来看,您要达到的目标并不完全清楚。但我认为您应该查看可以在 Inline 上设置的“extra”、“max_num”和“readonly_fields”字段。还可以看看其他字段:docs.djangoproject.com/en/dev/ref/contrib/admin/…
  • @jgadelange 好吧,我将所有字段都放在了 UserOrderAdmin 的 readonly_fields 中,它有效地完成了这项工作。但是它确实没有做我想要的,即只保存 Parent,因为它很可能仍在尝试同时保存 UserOrder。我希望有一些简单的方法可以使整个内联模型停止保存父保存。如果我在模型中添加一个新字段,我必须进去并在这里添加它。如果你想让它成为一个正确的答案以便我接受它?

标签: python django django-admin


【解决方案1】:

从您对我的评论的回复中,我了解到您想在管理员中显示一些额外的信息,这是不可编辑的。这可以在 Inline 中使用 readonly_fields 来实现,为了完整起见,您还应该将 max_num 设置为 0,否则您可以添加空内联。

您可以手动输入所有字段或使用此答案中给出的内容:https://stackoverflow.com/a/42877484/2354734

最终的结果应该是这样的。

class UserOrdersAdmin(admin.TabularInline):
    model = Order
    classes = ['collapse']
    max_num = 0

    def get_readonly_fields(self, request, obj=None):
        return list(set(
            [field.name for field in self.opts.local_fields] +
            [field.name for field in self.opts.local_many_to_many]
        ))

为了回答的完整性,还可以链接到documentation

【讨论】:

  • 我收到了一个带有该函数的 RecursionError:“超出最大递归深度”
  • 嗯……我应该先检查一下代码,然后再把它放在这里……给我一点时间……
  • 啊,这是因为get_fields 也调用了get_readonly_fields。我在搜索此内容时添加了指向另一个答案的链接。
  • 效果很好!我想我在搜索时使用了错误的关键字。
【解决方案2】:

试试这个:

class UserOrdersAdmin(admin.TabularInline):
    model = Order
    classes = ['collapse']
    extra = 0

【讨论】:

    猜你喜欢
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2015-04-04
    • 2014-04-22
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多