当从自定义模型继承时保留ModelAdmin属性(如list_display等)

3

我有一系列的表格,我希望它们都有一个排序字段。因此,我创建了一个抽象模型:

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",),你还能期望它是其他什么吗?如果你想要ordertitle,你需要一个语句来告诉list_display = ("order", "title")。@SimonKagwi给出了一种方便且DRY的方法。 - Stan
1个回答

9
class ChapterAdmin(OrderedAdmin):
    list_display = OrderedAdmin.list_display + ("title",)

请提供更多信息,因为并非每个人都能理解为什么这是答案。谢谢。 - markusschmitz
1
@Fuzzy,tuples是不可变的,但您可以使用“+”运算符将它们连接起来。因此,在这里,您将OrderedAdmin.list_display - ("order",")("title",)连接起来。这个操作的结果是一个新的元组("order", "title") - Stan
1
此外,由于Python类变量的工作方式,无法执行list_display +=(“title”,)。请参阅https://dev59.com/IXA65IYBdhLWcg3wxBir。 - Simon Kagwi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接