如何禁止管理员在 Django 管理员中更改实例?
Posted
技术标签:
【中文标题】如何禁止管理员在 Django 管理员中更改实例?【英文标题】:How to disallow admin to change instance in Django admin? 【发布时间】:2017-06-08 07:34:41 【问题描述】:我有一个模型Order
和模型Invoice
。 Order
有
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 管理界面 - 如何在更改列表视图中折叠/展开对象详细信息?