我有一系列的表格,我希望它们都有一个排序字段。因此,我创建了一个抽象模型:
class OrderedModel(models.Model):
order = models.IntegerField(default=-1)
def _order(self):
pass #ordering widget for changelist_view
_order.allow_tags = True
def save(self,*args,**kwargs):
#set order = 0 if < 0
super(OrderedModel,self).save(*args,**kwargs)
class Meta:
abstract = True
我不想让他们在change_view中更改“order”字段,所以我创建了以下ModelAdmin:
class OrderedAdmin(models.ModelAdmin):
list_display = ("__str__","_order","order")
list_editable = ("order",)
readonly_fields = ("order",)
只要每个继承自OrderedModel的模型不需要在list_display、list_editable或readonly_fields中添加更多项目,那就没问题。例如,以下示例将生成错误,因为order在list_editable中但不在list_display中:
class Chapter(OrderedModel):
title = models.CharField(max_length=32)
class ChapterAdmin(OrderedAdmin):
list_display = ("title",)
我注意到有一个"get_readonly_fields"函数可以更改,以确保将"order"添加到readonly_fields中,但是没有"get_list_display"或"get_list_editable"可供覆盖。是否有可能实现这一点?
ChapterAdmin
中设置了list_display = ("title",)
,你还能期望它是其他什么吗?如果你想要order
和title
,你需要一个语句来告诉list_display = ("order", "title")
。@SimonKagwi给出了一种方便且DRY的方法。 - Stan