在Django admin中显示ManyToMany关系的两面

时间:2017-05-10 13:42:10

标签: python django django-models django-admin

假设我有以下具有多对多关系的模型:

models.py:

class Foo(models.Model):

    name = models.TextField()


class Bar(models.Model):

    name = models.TextField()
    foos = models.ManyToManyField(Foo, related_name='bars')

然后以下列方式在管理员中定义它们:

admin.py

@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。

3 个答案:

答案 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的模块,它提供了一个定义“双向多对多字段”的通用机制。我不确定它是否仍然有效,因为最后的贡献是两年了,有点值得尝试一下。