[英]Displaying both sides of a ManyToMany relationship in Django admin
假設我有以下具有多對多關系的模型:
class Foo(models.Model):
name = models.TextField()
class Bar(models.Model):
name = models.TextField()
foos = models.ManyToManyField(Foo, related_name='bars')
然后通過以下方式在管理員中定義它們:
@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
pass
@admin.register(Bar)
class BarAdmin(admin.ModelAdmin):
pass
在 Django admin 中,當瀏覽Bar
實例時,我可以看到Bar
關聯的Foo
實例,並且可以從那里修改它們。
但是, Foo
沒有這樣的運氣,我看不到每個 Foo object 與之關聯的Bar
實例。
Django 可以為此定義自動處理還是我需要推出自己的方法?
我正在使用 Python 3.6.1 和 Django 1.11。
您可以像這樣定義自定義InlineModelAdmin
:
class BarInline(admin.TabularInline):
model = Bar.foos.through
並在你的FooAdmin
使用它:
class FooAdmin(admin.ModelAdmin):
"""Foo admin."""
model = Foo
inlines = [
BarInline,
]
看看django 文檔的這一部分。
您可以像這樣為list_display
定義自定義字段:
@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
"""Foo admin."""
list_display = ('name', 'get_bars')
search_fields = ('name',)
def get_bars(self, obj):
return obj.bars.all()
這是一個非常簡單的例子,但我希望它可以幫助你作為一個起點。
編輯:
您可以在編輯表單中以只讀方式顯示關聯的對象:
readonly_fields = ('get_bars',)
fields = ('name', 'get_bars')
有一個名為django-admin-extend的模塊,它提供了一個定義“Bidirectional many to many fields”的通用機制。 我不確定它是否仍然有效,因為最后的貢獻是兩年了,有點值得嘗試一下。
下面這段代碼可以在 Django Admin 的同一頁面上以多對多關系顯示Foo
和Bar
模型:
class BarInline(admin.TabularInline):
model = Bar.foos.through
@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
inlines = (BarInline,)
請注意,如果在多對多關系中使用model = Bar
而不是model = Bar.foos.through
,如下所示:
class BarInline(admin.TabularInline):
# model = Bar.foos.through
model = Bar # This will get error
@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
inlines = (BarInline,)
您將收到以下錯誤:
錯誤:<class 'xxx.admin.BarInline'>: (admin.E202) 'xxx.Bar' 沒有指向 'xxx.Foo' 的外鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.