python 在Django admin中显示多对多关系的双方

yzuktlbb  于 2023-01-29  发布在  Python
关注(0)|答案(4)|浏览(210)

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

www.example.commodels.py:

class Foo(models.Model):
    name = models.TextField()

class Bar(models.Model):
    name = models.TextField()
    foos = models.ManyToManyField(Foo, related_name='bars')

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

www.example.comadmin.py

@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
    pass

@admin.register(Bar)
class BarAdmin(admin.ModelAdmin):
    pass

在Django管理中,当浏览Bar示例时,我可以看到Bar关联的Foo示例,并可以在那里修改它们。
然而,Foo就没有这样的运气了,我看不到每个Foo对象都关联的Bar示例。
Django可以定义自动处理吗?还是我需要自己来处理?
我使用的是Python 3.6.1和Django 1.11。

kxeu7u2r

kxeu7u2r1#

您可以定义一个定制的InlineModelAdmin,如下所示:

class BarInline(admin.TabularInline):
    model = Bar.foos.through

并在FooAdmin中使用它:

class FooAdmin(admin.ModelAdmin):
"""Foo admin."""
    model = Foo
    inlines = [
        BarInline,
    ]

请看一下django文档的这一部分。

sxpgvts3

sxpgvts32#

您可以为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')
m2xkgtsf

m2xkgtsf3#

有一个叫django-admin-extend的模块,它提供了一个通用的机制来定义“双向多对多字段”。我不确定它是否仍然工作,因为最后的贡献是两年前的,位应该值得一试。

8gsdolmq

8gsdolmq4#

下面的代码可以在Django Admin的同一个页面上显示多对多关系中的FooBar模型:

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,)

您将看到以下错误:
错误:〈类“xxx.管理员条内联”〉:(admin.E202)“xxx.Bar”没有指向“xxx. Foo”的外键。

相关问题