Django管理后台 - 覆盖已注册的模型

5
我需要覆盖 django-eav 应用程序的管理类。在 eav/admin.py 中,模型已注册:admin.site.register(Value)。我需要向此模型添加 list_display。我知道修改已安装应用程序代码是不好的做法,所以我需要覆盖它。但是,我不确定如何做。在我的自己的 app/admin.py 中,我有:
class EavValueAdmin(ModelAdmin):
    list_display = ('__unicode__', 'value_text', )

#unregistering class from eav.admin
admin.site.unregister(Value)
admin.site.register(Value, EavValueAdmin)

我遇到了一个错误:NotRegistered: The model Value is not registered。如果我试图注释掉这一行代码:admin.site.unregister(Value),又会出现一个错误:AlreadyRegistered: The model Value is already registered。我该如何解决这个问题?

1个回答

9
Django 应用程序的加载顺序与在 settings.py 文件中的 INSTALLED_APPS 列表中的排列顺序相同。因此,为了能够注销它,您的 app 必须在 django-eav 之后加载:
INSTALLED_APPS = [...
   'django-eav',
   ...
   'my_app',
]

通常您的应用程序必须放在内置和第三方应用程序之后。在更改顺序后,您必须测试您的项目以查看是否一切正常运行。

相反地,我一直认为你的应用程序应该出现在第三方和内置应用程序之前。这意味着模板和媒体可以更容易地被覆盖,等等。 - meshy
Meshy是正确的。如果您的应用程序覆盖了django-eav的模板,则在INSTALLED_APPS中使您的应用程序出现在django-eav之后会破坏默认的模板解析。 - hedleyroos
@hedleyroos 这取决于您的使用情况。从这个问题可以看出,如果您的应用程序出现在django-eav之前,您将无法注销管理员处理程序。即使在这种情况下,您也可以始终使用专用模板文件夹覆盖模板。 - Selcuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接