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

Nob*_*lis 3 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')
Run Code Online (Sandbox Code Playgroud)

然后以以下方式在admin中定义它们:

管理员

@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',)
Run Code Online (Sandbox Code Playgroud)

在Django admin中,浏览Bar实例时,我可以看到Foo实例Bar与之关联,并可以从那里修改它们。

但是,没有这样的运气Foo,我看不到Bar每个Foo对象都与之关联的实例。

Django可以为此定义自动处理吗,还是我需要滚动自己的方法?

我正在使用Python 3.6.1和Django 1.11。

小智 6

您可以这样定义一个自定义InlineModelAdmin

class BarInline(admin.TabularInline):
    model = Bar.foos.through
Run Code Online (Sandbox Code Playgroud)

并将其用于您的FooAdmin

class FooAdmin(admin.ModelAdmin):
"""Foo admin."""
    model = Foo
    inlines = [
        BarInline,
    ]
Run Code Online (Sandbox Code Playgroud)

看看django 文档的这一部分。


cez*_*zar 4

您可以像这样定义自定义字段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()
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的示例,但我希望它可以作为起点对您有所帮助。

编辑:

您可以将编辑表单中的关联对象显示为只读:

readonly_fields = ('get_bars',)
fields = ('name', 'get_bars')
Run Code Online (Sandbox Code Playgroud)