如何在 Django 管理员中删除特定模型的添加按钮?
Posted
技术标签:
【中文标题】如何在 Django 管理员中删除特定模型的添加按钮?【英文标题】:How to remove Add button in Django admin, for specific Model? 【发布时间】:2013-12-16 07:59:05 【问题描述】:我有 Django 模型“AmountOfBooks”,它用作 Book 模型的余额。 如果这不是数据库建模的好模式,那就这么说吧。
AmountOfBooks 有两个字段:
class AmountOfBooks(models.Model):
book = models.ForeignKey(Book, editable=False)
amount = models.PositiveIntegerField(default=0, editable=False, help_text="Amount of book.")
它们设置为 editable=False,因为此模型只能通过代码进行编辑。 例如。何时为该书在 AmountOfBooks 中创建对象设置为 0,并且当添加或获取书籍时,余额会增加或减少。
因此,当我在 Django 管理员中单击“添加图书数量”按钮时,不会显示 AmountOfBooks 模型的字段。
但我想仅针对 AmountOfBooks 模型从 Django 管理员中删除该按钮。 怎么办?
更新 这个问题的继续可以在How to make Django model just view (read-only) in Django Admin?
【问题讨论】:
您是否有理由不将其作为Book
上的字段进行跟踪?也就是说,add
按钮只会显示给拥有相应权限的用户,因此如果您不向任何人授予此模型的add
权限,除了超级用户之外,没有人会看到add
按钮。
我正在构建应用程序,其中每本书(大约有 100 本书)在日常基础上都会丢失输入和输出。例如。有人会拿 50 本书,在以太上一个会拿 30,然后他们会添加 200 本书,依此类推。所以模型 AmountOfBooks 就像天平一样使用,这样他们就知道每本书有多少。如果只保留更改权限,用户可以查看书籍,但仍然可以选择更改,尽管由于可编辑=False,他无法更改任何内容。所以这是一些解决方法。但是,如果有一种方法可以提供对该模型的只读(仅查看)访问权限,我会更好。
检查这个问题的答案:***.com/questions/7920371/whole-model-as-read-only/…,同时在ModelAdmin
上寻找get_readonly_fields
@WebOrCode - 该评论仍然无法解释为什么这不仅仅是Book
上的一个字段。每本书在相应的表格中都有一行。可以为每一行维护可用副本的运行计数,并且将更有效地查找和编辑。另外,您可以将字段设置为editable=False
,并且管理员不会提供更改它的可能性。
@PeterDeGlopper 我开始看到您的设计带来的好处。我认为我目前的设计太复杂了。你能解释一下你将如何处理事务表(应该有数据的表)谁拿了或给了什么书以及什么时候?
【参考方案1】:
这很简单,只需在 Admin 类中重载 has_add_permission 方法,如下所示:
class MyAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
return False
【讨论】:
对不起,是否允许使用“复制和过去”其他用户的答案? ***.com/questions/4143886/… 是否可以禁用用户模型的添加权限?我想在 Wagtail 管理员中禁用添加用户按钮【参考方案2】:您询问了您的设计本身,所以我将首先解决这个问题。如果您想保留股票的历史记录,那么拥有一个不同的表(模型)是有意义的,但是您需要一个时间戳字段和一个对(书籍、时间戳)的唯一约束。现在,如果您只想保持库存最新,那么 book 和 amount 之间的关系实际上是一对一的,因此 amount 字段确实属于 book 表。在这种情况下,您只需将“数量”添加到图书的 ModelAdmin“readonly_fields”属性中,您的问题就解决了。
【讨论】:
【参考方案3】:为此,您需要在 Admin 类中覆盖 has_add_permission
方法:
class AmountOfBooksAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
return False
# to disable editing for specific or all fields
# you can use readonly_fields attribute
# (to see data you need to remove editable=False from fields in model):
readonly_fields = ('book', 'amount')
这里的文档:https://docs.djangoproject.com/en/dev/ref/contrib/admin/
【讨论】:
如果我这样做,我仍然可以更改模型,我希望只拥有查看功能。 @WebOrCode 你需要 has_change_permission 当我添加 has_change_permision 时,我再也看不到该表了。 has_add_permission 和 has_change_permission 的工作方式与用户的适当权限相同。 @WebOrCode 你是对的,使用 has_change_permission 你不能查看数据...在模型中可编辑没有帮助?以上是关于如何在 Django 管理员中删除特定模型的添加按钮?的主要内容,如果未能解决你的问题,请参考以下文章