如何使 Django 管理面板中的字段仅在创建模型时可写,而在其他时间只能读取?

How can a field in the Django admin panel be made writable for a model only when it is being created, and it'll be read only at other times?

我正在做一个类似于股票市场的项目。在这个项目中,我有一个名为 Stock 的模型,如下所示:

class Stock(models.Model):
    _title = models.CharField(max_length=50)
    _description = models.TextField()
    _total_subs = models.IntegerField()
    _sold_out_subs = models.IntegerField()
    _created_at = models.DateTimeField(auto_now_add=True)
    _updated_at = models.DateTimeField(auto_now=True)
    _status = models.BooleanField()

只能通过 Django 管理面板访问为此模型创建新记录,因此在我应用程序的 admin.py 文件中,我写了一个 class 来管理它,称为 StockAdmin 作为如下:

class StockAdmin(admin.ModelAdmin):
    list_display = []
    readonly_fields = ['_sold_out_subs']
    
    class Meta:
        model = Stock

我怎样才能创建一个 _total_subs 以便它在创建时可以写入,然后它应该在只读字段中?

你可以像这样获取基于对象的只读字段

class StockAdmin(admin.ModelAdmin):
    list_display = []

    def get_readonly_fields(self, request, obj=None):
       if obj:
           return ['_sold_out_subs']
       else:
           return []

除此之外,以下划线开头的字段名称不是好的 django 做法,因为它们暗示该字段是私有的。 查看此答案以获取更多信息 What is the meaning of single and double underscore before an object name?

通过添加 list_editable = [] 添加除 _total_subs

之外的所有字段

使用get_readonly_fields方法

class StockAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        return ['_sold_out_subs'] if obj else []