将django admin内联在不同的应用中

时间:2016-06-01 18:12:02

标签: django django-admin

我正在尝试解耦2个应用,到目前为止,我已经将实现的不同部分分开了。然而,当解耦 django-admin 时,我陷入了困境。应用程序之间的依赖关系必须明确(即 NO循环依赖应存在于这些应用程序中)。然而,系统的可用性不应该受到严重损害。

方案

在图书馆系统中,目录应用和持有应用已分离,其中目录仅涉及书目编目,而持有是关于图书馆拥有的书籍。

模型:

  • catalog.Book是图书信息的模型
  • holding.BookCopy是本书的实体副本的模型。

BookBookCopyBookCopy,而Book属于# File: catalog/admin.py from holding import models as holding_models # ... class BookCopyInline(TabularInline): model = holding_models.BookCopy class BookAdmin(ModelAdmin): model = Book inlines = [BookCopyInline] admin.site.register(Book, BookAdmin)

很明显,持有应用必须依赖于目录,但目录不应取决于持有

管理:

BookCopyInline
  

问题:目录管理员与持有模型有依赖关系,使其成为反向的不必要的依赖关系。 (目录应用程序不应取决于持有,但持有可取决于目录)

尝试1:

# File: catalog/admin.py from holding import admin as holding_admin class BookAdmin(ModelAdmin): model = Book inlines = [holding_admin.BookCopyInline] admin.site.register(Book, BookAdmin) # File: holding/admin.py class BookCopyInline(TabularInline): model = BookCopy 移至 holding / admin.py

git reset --hard origin/Dev
  

仍有循环应用程序依赖项,但我们只依赖于holding.admin,而不依赖于模型。哪个更好,但尚未完全解耦。

1 个答案:

答案 0 :(得分:0)

此问题的一种可能解决方案是在保持模块中添加内联,并在保持模块内重新注册ModelAdmin。

# File: catalog/admin.py
class BookAdmin(ModelAdmin):
    model = Book

# File: holding/admin.py
from catalog.admin import BookAdmin

class BookCopyInline(TabularInline):
    model = BookCopy
BookAdmin.inlines.append(BookCopyInline)

admin.site.unregister(BookAdmin)
admin.site.register(catalog_models.Book, catalog_admin.BookAdmin)