如何禁止管理员在 Django 管理员中更改实例?

Posted

技术标签:

【中文标题】如何禁止管理员在 Django 管理员中更改实例?【英文标题】:How to disallow admin to change instance in Django admin? 【发布时间】:2017-06-08 07:34:41 【问题描述】:

我有一个模型Order 和模型InvoiceOrder

invoice = models.OneToOneField('Invoice', related_name='order', on_delete=models.CASCADE, blank=True, null=True)

发票对象是在创建订单对象并分配给它之后立即创建的。管理员必须在客户付款之前编辑发票(价格字段)。

问题是Django-admin 也允许管理员更改此字段(图像底部),我不能冒险,但我想让铅笔图标(更改发票的属性)。

有可能做到吗?当我在OrderAdmin 中将invoice 添加到readonly_fields 时,管理员无法编辑invoice.price 等属性。

编辑:

所以我希望管理员能够编辑发票的属性。不添加也不从下拉列表中选择。

【问题讨论】:

【参考方案1】:

一种选择是为此视图提供自定义模板。 docs 表示您可以使用 ModelAdmin.change_form_template 指定自定义模板的路径。

这是文档中讨论如何覆盖模板的部分:https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#overriding-vs-replacing-an-admin-template

虽然这不是最佳解决方案,但您可能可以使用 javascript 来隐藏/禁用您不需要的部分。

最后,你可能要考虑一下你对 Django admin 的使用:

管理员推荐的使用仅限于组织的内部 管理工具。它不适用于构建整个前端 周围。

管理员有许多自定义钩子,但要小心尝试 专门使用这些钩子。如果您需要提供更多 以流程为中心的接口,抽象了实现 数据库表和字段的详细信息,那么可能是时候 写下你自己的观点。

【讨论】:

【参考方案2】:
def has_add_permission(self, request):
    return False

Django admin: How to display a field that is marked as editable=False' in the model?

【讨论】:

它必须是可编辑的并且只能编辑。管理员不能更改对象或添加新对象。仅编辑。 def has_add_permission(self, request): return False

以上是关于如何禁止管理员在 Django 管理员中更改实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django、python 中更改管理字段名称

Django:管理员:在管理员中更改字段的小部件

在 nginx 上更改标题“Django 管理”文本

django 管理界面 - 如何在更改列表视图中折叠/展开对象详细信息?

授予“用户更改”权限时,如何防止 Django 管理员中的权限升级?

如何在 django 中获得特定任务的批准