Django ModelAdmin中的" list_display"可以显示ForeignKey字段的属性吗?

时间:2020-03-06 15:02:31  来源:igfitidea点击:

我有一个Person模型,该模型与Book具有外键关系。本书有许多领域,但我最关心的是"作者"(标准CharField)。

话虽如此,在我的PersonAdmin模型中,我想使用" list_display"显示" book.author"。我已经尝试了所有显而易见的方法(参见下文),但是似乎没有任何效果。有什么建议?

class PersonAdmin(admin.ModelAdmin):
  list_display = ['book.author',]

解决方案

根据文档,我们只能显示ForeignKey的__unicode__表示形式:

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display

似乎很奇怪,它不支持DB API中其他所有地方都使用的'book__author'样式格式。

原来有一张用于此功能的票证,标记为"无法修复"。

作为另一种选择,我们可以进行如下查找:

class UserAdmin(admin.ModelAdmin):
    list_display = (..., 'get_author')

    def get_author(self, obj):
        return obj.book.author
    get_author.short_description = 'Author'
    get_author.admin_order_field = 'book__author'

这个已经被接受了,但是如果还有其他假人(像我一样)没有立即从当前接受的答案中得到答案,那么这里有更多细节。

" ForeignKey"引用的模型类需要在其中包含一个" unicode"方法,如下所示:

class Category(models.Model):
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name

这对我来说很重要,应该适用于上述情况。这适用于Django 1.0.2.

我们可以使用可调用对象在列表显示中显示所需的任何内容。它看起来像这样:

def book_author(object):
  return object.book.author

class PersonAdmin(admin.ModelAdmin):
  list_display = [book_author,]

AlexRobbins的答案对我有用,除了前两行需要在模型中(也许这是假设的?),并且应该引用self:

def book_author(self):
  return self.book.author

然后管理部分可以很好地工作。

像其他人一样,我也选择了可调用对象。但是它们有一个缺点:默认情况下,我们无法订购它们。幸运的是,有一个解决方案:

def author(self):
    return self.book.author
author.admin_order_field  = 'book__author'