在 list_display 中显示内联模型字段

Posted

技术标签:

【中文标题】在 list_display 中显示内联模型字段【英文标题】:Show inline model field in list_display 【发布时间】:2016-06-30 20:03:04 【问题描述】:

我有两个模型:

class Person(models.Model):
    person_name = models.CharField(max_length=255)

    def __unicode__(self):
        return self.person_name

class Book(models.Model):
    link = models.ForeignKey(Person)
    book_name = models.CharField(max_length=255)
    book_year = models.CharField(max_length=255)
    book_email = models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

admin.py

class PersonAdmin(admin.ModelAdmin):
    inlines = ('BookInline',)
    list_display = ('person_name', ...)

class BookInline(admin.TabularInline):
    model = Book
    extra = 1
    max_num = 1

PersonAdminlist_display 中,我如何显示内联模型Book 字段(标题、姓名、电子邮件)。

所以当我在 django admin 中访问 Person 条目列表时,我看到:

person namebook namebook yearbook email

【问题讨论】:

Can "list_display" in a Django ModelAdmin display attributes of ForeignKey fields?的可能重复 【参考方案1】:

根据doc,您可以使用可调用对象来显示您的字段。

编辑 (2021/03/21):指向 1.9 文档的链接不再有效,但 the source 仍然可用。我也将链接添加到dev version。

【讨论】:

文档链接不再起作用(404 错误)。@Linkid 谢谢!我刚刚编辑了答案以添加 2 个链接:v1.9 的文档源(不再维护)和开发文档。【参考方案2】:
class BookInline(admin.StackedInline):
   model = Book
   extra = 1
   max_num = 1

StackedInline 将解决您的问题

【讨论】:

【参考方案3】:

PersonAdminlist_display 用于显示每个人一次。包含书籍模型中的属性并没有真正意义,因为如果该人拥有不止一本书,您将不得不多次包含该人。

在本书的list_display@ 中包含此人的姓名不是更好吗?

class BookAdmin(admin.ModelAdmin):
    inlines = ('BookInline',)
    list_display = ('person_name', 'book_name', 'book_email', 'book_year')

    def person_name(self, obj):
        returns obj.link.person_name

admin.site.register(Book, BookAdmin)

【讨论】:

这本书只有一个条目,并且该项目不需要列出书籍,只列出拥有书籍的人。一般来说是的,最好使用您的解决方案,但我的项目要求不同,需要在个人列表中包含书籍详细信息。 是的,这本书只有一个条目。问题是每个人可以拥有不止一本书。如果您在人员管理中显示一个人,您应该显示哪本书?如果该人没有书籍,您应该显示什么? 每个人最多只能拥有一本书,因为max_num = 1BookAdmin 中指定。并回答您的问题:即使有多本书,我也想展示第一本书。如果不存在书籍(这不会发生,因为它是必填字段),但我仍然会显示一个字符串“No books”。 max_num = 1 仅供管理员使用——同一个人的多本书仍然可以添加到其他地方。添加没有书的人很容易 - 只需在人员管理中创建一个人。如果你真的每本书都有一个人,那么你应该使用OneToOneField而不是外键。 它没有属性book,因为外键意味着每个人可以拥有多本书。有关更多信息,请参阅 following relationships backwards 上的文档。

以上是关于在 list_display 中显示内联模型字段的主要内容,如果未能解决你的问题,请参考以下文章

相关内联上的python django list_display [重复]

Django Admin:如何在 oneToOne 关系中的两个模型中显示带有 list_display 的字段值?

Django admin list_display 不显示模型方法返回项

Django admin:从反向 FK 聚合中排序 list_display 字段

通过相关模型上的过滤器对 list_display 字段进行排序

在子管理员中显示父字段 (list_display)