我有一个Person模型,它与Book有外键关系,Book有许多字段,但我最关心的是author(一个标准CharField)。
话虽如此,在我的PersonAdmin模型中,我想显示book。作者使用list_display:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
我已经尝试了所有显而易见的方法,但似乎都不起作用。
有什么建议吗?
我有一个Person模型,它与Book有外键关系,Book有许多字段,但我最关心的是author(一个标准CharField)。
话虽如此,在我的PersonAdmin模型中,我想显示book。作者使用list_display:
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
我已经尝试了所有显而易见的方法,但似乎都不起作用。
有什么建议吗?
当前回答
你可以使用可调用对象在列表显示中显示你想要的任何东西。它看起来是这样的:
def book_author(object): return object.book.author class PersonAdmin(admin.ModelAdmin): list_display = [book_author,]
其他回答
这个答案已经被接受了,但如果还有其他傻瓜(比如我)没有立即从目前接受的答案中得到它,这里有更多的细节。
ForeignKey引用的模型类需要有一个__unicode__方法,如下所示:
class Category(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
这对我来说很重要,也适用于上述情况。这适用于Django 1.0.2。
对于Django >= 3.2
在Django 3.2或更高版本中,正确的方法是使用显示装饰器
class BookAdmin(admin.ModelAdmin):
model = Book
list_display = ['title', 'get_author_name']
@admin.display(description='Author Name', ordering='author__name')
def get_author_name(self, obj):
return obj.author.name
作为另一种选择,你可以像这样查找:
#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
AlexRobbins的回答对我来说很有用,除了前两行需要在模型中(也许这是假设的?),并且应该引用self:
def book_author(self):
return self.book.author
然后管理部分工作得很好。
根据文档,你只能显示ForeignKey的__unicode__表示:
http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
似乎奇怪的是,它不支持'book__author'风格的格式,这种格式在DB API中随处可见。
事实证明,这个功能有一个门票,它被标记为不会修复。