Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何删除Django管理中针对特定型号的添加按钮?_Python_Django_Django Models_Django Admin - Fatal编程技术网

Python 如何删除Django管理中针对特定型号的添加按钮?

Python 如何删除Django管理中针对特定型号的添加按钮?,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,我有Django模型“AmountOfBooks”,它被用作书本模型的平衡。 如果这不是数据库建模的好模式,就这么说吧 无论如何,AmontofBooks有两个字段: class AmountOfBooks(models.Model): book = models.ForeignKey(Book, editable=False) amount = models.PositiveIntegerField(default=0, editable=False, help_t

我有Django模型“AmountOfBooks”,它被用作书本模型的平衡。
如果这不是数据库建模的好模式,就这么说吧

无论如何,AmontofBooks有两个字段:

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 admin中单击“添加图书数量”按钮时,AmountOfBooks模型的字段就不会显示

但我想从Django admin中删除该按钮,仅用于AmontofBooks型号。
怎么做

更新

此问题的继续部分可在

上找到。要执行此操作,您需要在Admin类中重写
has\u add\u 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')

这里的文档:

您询问了您的设计本身,因此我将首先解决这个问题。如果您想保留股票的历史记录,那么有一个不同的表(模型)是有意义的,但是您需要一个时间戳字段和一个唯一的约束(book,timestamp)。现在,如果您只想保持股票的最新状态,帐簿和金额之间的关系实际上是一对一,因此金额字段实际上属于帐簿表。在这种情况下,您只需将“amount”添加到书的ModelAdmin“readonly\u fields”属性中,您的问题就解决了。

这很简单,只是重载在您的管理类中有\u add\u权限方法,如下所示:

class MyAdmin(admin.ModelAdmin):
    def has_add_permission(self, request):
        return False

您不只是将其作为
书籍
上的字段进行跟踪,有什么原因吗?这就是说,
add
按钮只显示给具有相应权限的用户,因此如果您不给任何人此模型的
add
权限,除了超级用户之外,没有人会看到
add
按钮。我正在构建一个应用程序,其中每本书的输入和输出都将丢失(大约有100本书)在日常基础上。例如,有人会拿50本书,在以太上一本会拿30本,然后他们会添加200本书,以此类推。所以模型AmountOfBooks就像一个天平一样使用,这样他们就知道每本书有多少。如果只留下“更改”权限,用户可以查看书籍,但仍然可以选择更改,尽管由于editabl,他不能更改任何内容e=False。所以这是一些解决方法。但是如果有一种方法可以提供只读(仅查看)的话,我会更好访问此模型。检查此问题的答案:,同时在
ModelAdmin
@WebOrCode上查找
get\u readonly\u fields
——该注释仍然无法解释为什么这不仅仅是
Book
上的一个字段。每本书在相应的表中都有一行。可以为eac保留可用副本的运行计数h行,并将更高效地查找和编辑。此外,您可以将字段设置为
editable=False
,管理员不会提供更改它的可能性。@PeterDeGlopper我开始看到您的设计的好处。我认为我当前的设计太复杂了。您能解释一下您如何处理事务吗ble(表中应包含谁取了或给了什么书以及何时取的数据)?如果我这样做,我仍然可以更改模型,我只想拥有查看功能。@WebOrCode您需要拥有更改权限当我添加has\u change\u权限时,我将无法再看到该表。has\u add\u权限和has\u change\u权限的工作方式与用户的相应权限相同。@WebOrCode you right,has\u change\u权限您无法查看数据…模型中的“可编辑”没有帮助?抱歉,允许使用其他用户答案的“复制和过去”吗?是否可以禁用用户模型的添加权限?我想禁用Wagtail admin中的添加用户按钮