如何使 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 []
我正在做一个类似于股票市场的项目。在这个项目中,我有一个名为 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 []