【问题标题】:Preserving ModelAdmin attributes (list_display, etc.) when inheriting from a custom model从自定义模型继承时保留 ModelAdmin 属性(list_display 等)
【发布时间】:2012-01-28 01:49:42
【问题描述】:

我有一系列表格,我希望它们都有一个订单字段。于是我做了一个抽象模型:

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 中的“订单”字段,所以我制作了以下 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 我可以更改以确保将“订单”添加到 readonly_fields,但没有 get_list_display 或 get_list_editable 可以覆盖。可以这样做吗?

【问题讨论】:

  • 当然。如果在您的ChapterAdmin 中设置list_display = ("title",),您将如何期望它是其他任何东西?如果你想要order 和title,你需要一个告诉list_display = ("order", "title") 的语句。 @SimonKagwi 为您提供了一种方便且干燥的方式。

标签: django django-admin


【解决方案1】:
class ChapterAdmin(OrderedAdmin):
    list_display = OrderedAdmin.list_display + ("title",)

【讨论】:

  • 请提供更多信息,因为不是每个人都可能理解为什么这是答案。谢谢。
  • @Fuzzy, tuples 是不可变的,但你可以concatenate them with the '+' operator。所以在这里你连接OrderedAdmin.list_display - ("order",) - 和("title",)。这个操作的结果是一个新的元组("order", "title")。
  • 此外,由于 Python 类变量的工作方式,无法执行 list_display += ("title",)。见stackoverflow.com/questions/3648564/…
猜你喜欢
  • 2011-06-25
  • 2020-09-12
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多