簡體   English   中英

在 Django admin 中顯示多對多關系的雙方

[英]Displaying both sides of a ManyToMany relationship in Django admin

假設我有以下具有多對多關系的模型:

模型.py:

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

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

然后通過以下方式在管理員中定義它們:

管理員.py

@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 的同一頁面上以多對多關系顯示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,)

您將收到以下錯誤:

錯誤:<class 'xxx.admin.BarInline'>: (admin.E202) 'xxx.Bar' 沒有指向 'xxx.Foo' 的外鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM