在 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
在PersonAdmin
list_display 中,我如何显示内联模型Book
字段(标题、姓名、电子邮件)。
所以当我在 django admin 中访问 Person
条目列表时,我看到:
person name
book name
book year
book 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】:PersonAdmin
的 list_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 = 1
在BookAdmin
中指定。并回答您的问题:即使有多本书,我也想展示第一本书。如果不存在书籍(这不会发生,因为它是必填字段),但我仍然会显示一个字符串“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 字段