有没有一种干净的方法将依赖项从一个Django应用程序注入到另一个Django应用程序?
我有多个Django应用程序,其中一个是基础应用程序。这意味着,其他应用程序依赖于它,但基础应用程序不应该知道其他应用程序。在大多数情况下,这对于使用ForeignKeys和ManyToMany关系的依赖项与基础应用程序的模型来说不是问题。但是,在构建管理类时,为了将内联和链接添加到相应的依赖类,有必要在基础应用程序中指定这一点。可以直接从依赖的应用程序中注入吗?
发布于 2021-02-24 22:27:01
除了adding inlines的答案之外,我还必须为list disply和list filter向类添加属性。下面是为一个ForeignKey链接模型添加此链接的代码。Foo是一个父模型(在composition over inheritance的意义上),其他几个子模型通过其他应用程序中的OneToOne或ForeignKey字段链接到该父模型。这确保了父模型以及它所在的应用程序不依赖于它的子模型。
父App A中定义的模型和管理类。
# app_a/models.py
from django.db import models
class Foo(models.Model):
name = models.CharField(max_length=64)# app_a/admin.py
from django.contrib import admin
from .models import Foo
@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
list_display = ["name"]
list_display_links = ("name",)
list_filter = []
list_select_related = []子App B中定义的模型和管理类。
# app_b/models.py
from django.db import models
from app_a.models import Foo
class BarComponent(models.Model):
foo = models.OneToOneField(
Foo,
primary_key=True,
related_name="bar_component",
on_delete=models.CASCADE,
)
bar_type = models.CharField(max_length=42)# app_b/admin.py
from django.contrib import admin
from django.core.exceptions import ObjectDoesNotExist
from .models import BarComponent
from app_a.admin import FooAdmin
@admin.register(BarComponent)
class BarAdmin(admin.ModelAdmin):
pass
# Inject BarComponent aspect into admin for Foo
@mark_safe
def has_bar(self, obj):
try:
return '<a href="%s">%s</a>' % (
reverse(
"admin:appb_barcomponent_change",
args=(obj.bar_component.pk,),
),
obj.bar_component.bar_type,
)
except ObjectDoesNotExist:
return "-"
setattr(FooAdmin, "has_bar", has_bar)
setattr(FooAdmin.has_bar, "allow_tags", True)
setattr(FooAdmin.has_bar, "short_description", "Bar")
FooAdmin.list_display.append("has_bar")
FooAdmin.list_filter.append(("bar_component", admin.EmptyFieldListFilter))
FooAdmin.list_select_related.append("bar_component")免责声明:该代码是从我的项目中的功能代码中提取出来的。因此,它还没有经过测试,但是这个结构工作在my project上。
https://stackoverflow.com/questions/66348187
复制相似问题