如何在没有循环依赖的情况下向另一个应用程序的 ModelAdmin 添加内联?

sed*_*nym 4 django encapsulation django-admin

假设我有两个模型,在不同的应用程序中。应用二知道应用一,但不知道相反:

# one/models.py

from django.db import models

class One(models.Model):
    pass


# two/models.py

from django.db import models
from one.models import One

class Two(models.Model):
    one = models.ForeignKey(One)
Run Code Online (Sandbox Code Playgroud)

我也在One管理站点注册:

# one/admin.py

from django.contrib import admin
from .models import One

admin.site.register(One)
Run Code Online (Sandbox Code Playgroud)

如何TwoOne的管理页面上注册为 Inline ,而不在两个应用程序之间引入循环依赖?

sed*_*nym 5

您可以非常简单地做到这一点,只要您不介意访问ModelAdmin. (以下划线开头的属性按照惯例被视为私有。)

# two/admin.py
from django.contrib import admin
from one.models import One
from .models import Two

class TwoInline(admin.StackedInline):
    model = Two

admin.site._registry[One].inlines.append(TwoInline)
Run Code Online (Sandbox Code Playgroud)


小智 5

我有同样的问题,但以更温和的方式解决了它。

# one/admin.py

class OneAdmin(admin.ModelAdmin):
    model = One

admin.site.register(One, OneAdmin)
Run Code Online (Sandbox Code Playgroud)
# two/admin.py

class TwoInline(admin.TabularInline):
    model = Two

import one.admin
class OneAdmin(one.admin.OneAdmin):
    inlines = [TwoInline]

admin.site.unregister(One)
admin.site.register(One, OneAdmin)
Run Code Online (Sandbox Code Playgroud)

如您所见,我从第一个应用程序扩展了原始 ModelAdmin,并从第二个应用程序添加了内联。在再次注册之前,不要忘记从第一个应用程序中取消注册模型。与建议的访问类的私有成员相比,它安全且好得多。