我有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 admin中删除该按钮。
怎么做 ?
更新
有关如何在Django Admin中使Django模型仅显示(只读)的问题,可以继续此问题。
您有理由不只是将其作为Book上的字段进行跟踪吗?就是说,add按钮仅针对具有适当权限的用户显示,因此,如果您不向任何人授予此模型的add权限,则除超级用户外,没有人会看到add按钮。
我正在构建一个应用程序,在该应用程序上,每本书(每天大约有100本书)的输入和输出都会丢失。例如。某人将拿50本书,以太书将拿30本书,然后他们将再添200本书,依此类推。因此,模型AmountOfBooks就像天平一样使用,以便他们知道每本书有多少。如果仅保留更改权限,则用户可以看到书籍,但仍然可以更改,但由于editable = False,他无法更改任何内容。因此,这是一些解决方法。但是,如果有一种方法可以授予对此模型以只读(只读)访问权限,我会更好。
检查以下问题的答案:stackoverflow.com/questions/7920371/whole-model-as-read-only/,并在ModelAdmin上查找get_readonly_fields
@WebOrCode-该注释仍然无法解释为什么这不是Book上的一个字段。每本书在相应的表中都有一行。可以为每一行维护可用副本的运行计数,并且可以更有效地查找和编辑该副本。另外,您可以将字段设置为editable=False,而管理员将无法更改该字段。
@PeterDeGlopper我开始看到您设计的好处。我认为我当前的设计太复杂了。您能解释一下您将如何处理交易表(该表应具有谁在何时购买或提供什么书的数据)?
@WebOrCode-如果您要维护与给定书有关的所有交易记录,我认为您应该将金额视为计算值。如果您的秤允许,您可以在每次需要数量时对增加和减少进行求和。如果不允许,则可以保留带时间戳的金额,并加上该时间戳之后的增加和减少,以保持合理的记录数。后者的维护有点麻烦,并且需要更复杂的模型设置,因此,如果可以的话,请避免使用它-但是,如果您有足够的数据,则不能这样做。
很简单,只需在Admin类中重载has_add_permission方法,如下所示:
class MyAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
return False
抱歉,是否可以使用其他用户的"复制并粘贴"答案? stackoverflow.com/questions/4143886/
为此,您需要在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您无法查看数据...在模型中可编辑并没有帮助?
也可以使用@WebOrCode readonly_fields
您询问了您的设计本身,因此我将首先解决。 如果您想保留股票的历史记录,那么有一个独特的表(模型)是有意义的,但是您需要一个时间戳字段和一个唯一的约束(帐簿,时间戳)。 现在,如果您只是想保持库存最新状态,则帐簿和金额之间的关系实际上是一对一的,因此金额字段确实属于帐簿表。 在这种情况下,您只需要在本书的ModelAdmin的" readonly_fields"属性中添加"金额"即可解决您的问题。