我有一个Person模型,它与Book有外键关系,Book有许多字段,但我最关心的是author(一个标准CharField)。

话虽如此,在我的PersonAdmin模型中,我想显示book。作者使用list_display:

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

我已经尝试了所有显而易见的方法,但似乎都不起作用。

有什么建议吗?


当前回答

根据文档,你只能显示ForeignKey的__unicode__表示:

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

似乎奇怪的是,它不支持'book__author'风格的格式,这种格式在DB API中随处可见。

事实证明,这个功能有一个门票,它被标记为不会修复。

其他回答

在PyPI中有一个非常容易使用的包可以处理这个问题:django-related-admin。你也可以在GitHub中看到代码。

使用它,你想要达到的效果很简单:

class PersonAdmin(RelatedFieldAdmin):
    list_display = ['book__author',]

这两个链接都包含了安装和使用的全部细节,所以我不会把它们粘贴在这里,以防它们发生变化。

顺便说一句,如果你已经在使用模型以外的东西。Admin(例如,我使用的是SimpleHistoryAdmin代替),你可以这样做:类MyAdmin(SimpleHistoryAdmin, RelatedFieldAdmin)。

根据文档,你只能显示ForeignKey的__unicode__表示:

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

似乎奇怪的是,它不支持'book__author'风格的格式,这种格式在DB API中随处可见。

事实证明,这个功能有一个门票,它被标记为不会修复。

这个答案已经被接受了,但如果还有其他傻瓜(比如我)没有立即从目前接受的答案中得到它,这里有更多的细节。

ForeignKey引用的模型类需要有一个__unicode__方法,如下所示:

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

    def __unicode__(self):
        return self.name

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

作为另一种选择,你可以像这样查找:

#models.py
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'

从Django 3.2开始,你可以使用display()装饰器:

#models.py
class UserAdmin(admin.ModelAdmin):
    list_display = (..., 'get_author')
    
    @admin.display(ordering='book__author', description='Author')
    def get_author(self, obj):
        return obj.book.author

你可以使用可调用对象在列表显示中显示你想要的任何东西。它看起来是这样的:


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

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