假设我有以下具有多对多关系的模型:
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):
"""Foo admin."""
list_display = ('name',)
search_fields = ('name',)
@admin.register(Bar)
class BarAdmin(admin.ModelAdmin):
"""Bar admin."""
list_display = ('name',)
search_fields = ('name',)
在Django管理员中,在浏览Bar
个实例时,我可以看到Foo
个实例Bar
与之关联,并可以从那里修改它们。
但是,Foo
没有这样的运气,我无法看到与每个Foo对象相关联的Bar
个实例。
Django可以为此定义自动处理,还是需要滚动我自己的方法?
我正在使用Python 3.6.1和Django 1.11。
答案 0 :(得分:5)
您可以像这样定义自定义InlineModelAdmin
:
class BarInline(admin.TabularInline):
model = Bar.foos.through
并在FooAdmin
:
class FooAdmin(admin.ModelAdmin):
"""Foo admin."""
model = Foo
inlines = [
BarInline,
]
看一下django documentation的这一部分。
答案 1 :(得分:1)
您可以像这样定义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')
答案 2 :(得分:0)
有一个名为django-admin-extend的模块,它提供了一个定义“双向多对多字段”的通用机制。我不确定它是否仍然有效,因为最后的贡献是两年了,有点值得尝试一下。