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)
如何Two在One的管理页面上注册为 Inline ,而不在两个应用程序之间引入循环依赖?
您可以非常简单地做到这一点,只要您不介意访问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,并从第二个应用程序添加了内联。在再次注册之前,不要忘记从第一个应用程序中取消注册模型。与建议的访问类的私有成员相比,它安全且好得多。
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |