在list_display django中显示子类的信息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在list_display django中显示子类的信息相关的知识,希望对你有一定的参考价值。
我在models.py中有两个类:
class ModelOne(models.Model): field_one = models.CharField(max_length=100) field_two = models.CharField(max_length=200) field_three = models.CharField(max_length=300) [...] #other fields def __unicode__(self): return self.field_one class ModelTwo(models.Model): relation_model_one = models.ForeignKey(ModelOne) other_field = models.CharField(max_length=50) [...] def __unicode__(self): return self.relation_model_one.field_one
您在admin.py中的管理是这样的:
class ModelTwoInline(admin.StackedInline): model = ModelTwo extra = 0 class ModelOneAdmin(admin.ModelAdmin): list_display = ('field_one', 'field_two', 'field_three',) inlines = [ModelTwoInline]
我的问题是:我可以在ModelOne的list_display中显示ModelTwo的字段吗? (list_filter和search_fields相同)
我需要这个,因为我有许多与主类相关的子类!
您可以通过使用list_display
装饰器编写实例方法,在@property
中显示您想要的任何内容,然后返回您需要的任何内容,并将其包含在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()
一个)。这并不一定意味着你不应该这样做 - 这可能是正确的答案,取决于你的情况。请注意,这可能是一项非常昂贵的操作。
您应该使用字段或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 model._meta.get_fields(include_hidden=False)
]
return self.list_display + extra_fields
以上是关于在list_display django中显示子类的信息的主要内容,如果未能解决你的问题,请参考以下文章
Django admin list_display 不显示模型方法返回项
Django Admin:如何在 oneToOne 关系中的两个模型中显示带有 list_display 的字段值?
如何在 Django admin 中本地化 list_display 字段?