如何在没有循环依赖的情况下将内联添加到另一个应用程序的 ModelAdmin?
How can I add inlines to the ModelAdmin of another app, without a circular dependency?
假设我在不同的应用程序中有两个模型。应用二知道应用一,但反过来不知道:
# 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)
如何在 One
的管理页面上将 Two
注册为 Inline,而不在两个应用程序之间引入循环依赖?
只要您不介意访问 ModelAdmin
上的 'private' 属性,您就可以非常简单地完成此操作。 (按照惯例,以下划线开头的属性被视为私有属性。)
# 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)
我会尝试以下方法:
# 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 阅读更多内容。
我遇到了同样的问题,但用更温和的方式解决了。
# 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 并添加了第二个应用程序的内联。在再次注册之前,不要忘记从第一个应用程序中注销模型。
它比建议的访问 class 的私有成员安全且好得多。
假设我在不同的应用程序中有两个模型。应用二知道应用一,但反过来不知道:
# 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)
如何在 One
的管理页面上将 Two
注册为 Inline,而不在两个应用程序之间引入循环依赖?
只要您不介意访问 ModelAdmin
上的 'private' 属性,您就可以非常简单地完成此操作。 (按照惯例,以下划线开头的属性被视为私有属性。)
# 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)
我会尝试以下方法:
# 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 阅读更多内容。
我遇到了同样的问题,但用更温和的方式解决了。
# 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 并添加了第二个应用程序的内联。在再次注册之前,不要忘记从第一个应用程序中注销模型。 它比建议的访问 class 的私有成员安全且好得多。