【问题标题】:Show information of subclass in list_display django在 list_display django 中显示子类的信息
【发布时间】:2011-05-16 19:40:59
【问题描述】:

我在 models.py 中有两个类:

类 ModelOne(models.Model):
   field_one = models.CharField(max_length=100)
   field_two = models.CharField(max_length=200)
   field_three = models.CharField(max_length=300)
   [...] #其他字段
   def __unicode__(self):
       返回 self.field_one

类模型二(模型。模型):
   关系模型一 = 模型。外键(模型一)
   other_field = models.CharField(max_length=50)
   [...]
   def __unicode__(self):
       返回 self.relation_model_one.field_one

你在 admin.py 中的管理是这样的:

类 ModelTwoInline(admin.StackedInline): 模型 = 模型二 额外 = 0 类 ModelOneAdmin(admin.ModelAdmin): list_display = ('field_one', 'field_two', 'field_three',) 内联 = [ModelTwoInline]

我的问题是: 可以在 ModelOne 的 list_display 中显示 ModelTwo 的字段吗? (list_filter 和 search_fields 一样)

我需要这个,因为我有很多与主类相关的子类!

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您应该使用字段的相关名称或RelatedModel._meta.get_fields

    class ModelOneAdmin(admin.ModelAdmin):
        list_display = ('field_one', 'field_two', 'field_three')
        inlines = [ModelTwoInline]
    
        def get_list_display(self, request):
            extra_fields = [
                f.name for model in self.inlines 
                for f in ModelTwo._meta.get_fields(include_hidden=False) 
            ]
            return self.list_display + extra_fields
            
    

    【讨论】:

      【解决方案2】:

      您可以通过使用@property 装饰器编写一个实例方法在list_display 中显示您想要的任何内容,然后返回您需要的任何内容,并将其包含在list_display 中。我认为这不适用于list_filter

      那么,让我们回到你的ModelOne 课程:

      class ModelOne(models.Model):
          [...]
      
          def __unicode__(self):
              return self.field_one
      
          @property
          def model_two_other_field(self):
              return ', '.join([m2.other_field for m2 in self.modeltwo_set.all()])
      

      然后,在您的 ModelOneAdmin 中:

      class ModelOneAdmin(admin.ModelAdmin):
          list_display = ('field_one', 'field_two', 'field_three', 'model_two_other_field')
          [...]
      

      作为记录,我要注意的是,当您执行此操作时,您将需要为显示的每个 ModelOne 实例进行数据库匹配。因此,如果您列出 50 个实例,则会产生 50 个单独查询的开销(每次调用 self.modeltwo_set.all() 一个)。这并不一定意味着您不应该这样做——这可能是正确的答案,具体取决于您的情况。请注意,这可能是一项非常昂贵的操作。

      【讨论】:

        猜你喜欢
        • 2018-12-03
        • 2020-06-07
        • 2011-06-19
        • 2022-01-10
        • 2013-04-28
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 2017-04-07
        相关资源
        最近更新 更多