我've tried to override AdminSite class with my own custom class. I followed tutorial from django'的文档:https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#customizing-adminsite但它没有't work. To be specific, I'喜欢用我自己的类覆盖原始的AdminSite而不只是在我的项目中添加另一个管理站点 .
我已经创建了从类继承的自定义类MyAdminSite
from django.contrib.admin import AdminSite
class MyAdminSite(AdminSite):
pass
然后在我的app urls.py中添加:
from django.conf.urls import url, include
import django.contrib.admin as admin
from .admin_site import MyAdminSite
admin.site = MyAdminSite()
admin.autodiscover()
urlpatterns = [
url(r'^', admin.site.urls),
]
它似乎工作,但管理员模型注册到MyAdminSite的AdminSite .
我尝试了三种注册模型到我的自定义网站的方法:
@admin.register(Model)
class ModelAdmin(model.AdminModel):
...
这种方式模型已注册到原始AdminSite .
第二种方式:
@admin.site.register(Model):
class ModelAdmin(model.AdminModel):
...
这不起作用并导致异常 . ModelAdmin类未传递给register方法 .
最后一种方式
class ModelAdmin(model.AdminModel):
...
admin.site.register(Model, ModelAdmin)
这是有效的,但在管理员网站上我只能看到我的模型不是来自Django管理员(用户和组)的模型 .
如何永久覆盖admin.site并将所有模型注册到MyAdminSite?
3 回答
来自myapp / admin.py:
来自myproject / urls.py
我没有找到问题的解决方案,但我做了一个解决方法 .
首先,我们需要在我们的应用程序中创建模块(例如admin.py),然后扩展类AdminSite:
然后在模块的底部我们需要创建MyAdminSite的实例并从Django注册内置模型:
必要的进口:
在我们的网站url模块中,我们需要覆盖原始网站对象:
我们需要做的最后一项更改是注册我们的模型 . 我们需要记住的一件事是我们不能像这样使用寄存器作为装饰器:
要么:
我们需要定义ModelAdmin类,然后在MyAdminSite对象上调用register:
这是唯一适合我的解决方案 .
我遇到了类似的问题 . 我使用Django 2.1和the hook从上面的评论不适合我 . 而且我也无法像这样导入GroupAdmin和UserAdmin
由于某种原因导入GroupAdmin或UserAdmin破坏了代码 . 我无法确定具体原因 .
所以我的解决方法是(在
project/urls.py
):这里的想法是从默认管理站点复制注册的模型 . 也许这样做并不好,但我找不到任何其他工作 .