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

时间:2015-09-15 16:14:54

标签: django django-admin encapsulation

我们说我在不同的应用程序中有两个模型。 App Two知道应用程序One,但不是相反:

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

我也在管理站点注册了One

# one/admin.py

from django.contrib import admin
from .models import One

admin.site.register(One)

如何在Two的管理页面上注册One作为内联,而不会在两个应用之间引入循环依赖关系?

3 个答案:

答案 0 :(得分:4)

你可以非常简单地做到这一点,只要你不介意访问私人' 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)

答案 1 :(得分:2)

我有同样的问题,但解决方法更温和。

# one/admin.py

class OneAdmin(admin.ModelAdmin):
    model = One

admin.site.register(One, OneAdmin)
# 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)

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

答案 2 :(得分:0)

我会尝试以下方法:

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

class TwoInline(admin.StackedInline):
    model = Two

class OneAdmin(admin.ModelAdmin):
    inlines = [TwoInline,]

admin.site.register(One, OneAdmin)

您可以在docs了解更多信息。