【问题标题】:How to disallow admin to change instance in Django admin?如何禁止管理员在 Django 管理员中更改实例?
【发布时间】: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 等属性。

编辑:

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

【问题讨论】:

    标签: python django django-admin


    【解决方案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
      猜你喜欢
      • 2020-11-25
      • 2011-01-23
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2015-06-10
      • 2021-10-18
      • 2019-04-25
      • 2020-03-15
      相关资源
      最近更新 更多