我试图用我自己的自定义类覆盖AdminSite类.我按照django的文档中的教程:https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#customizing-adminsite但它没有用.具体来说,我想用我自己的类覆盖原始的AdminSite,而不只是在我的项目中添加另一个管理站点.
我创建了从类继承的自定义类MyAdminSite
from django.contrib.admin import AdminSite
class MyAdminSite(AdminSite):
pass
Run Code Online (Sandbox Code Playgroud)
然后在我的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),
]
Run Code Online (Sandbox Code Playgroud)
它似乎工作,但管理员模型注册到AdminAdite的MyAdminSite.
我尝试了三种注册模型到我的自定义网站:
@admin.register(Model)
class ModelAdmin(model.AdminModel):
...
Run Code Online (Sandbox Code Playgroud)
这种方式模型已注册到原始AdminSite.
第二种方式:
@admin.site.register(Model):
class ModelAdmin(model.AdminModel):
...
Run Code Online (Sandbox Code Playgroud)
这不起作用并导致异常.ModelAdmin类未传递给register方法.
最后一种方式
class ModelAdmin(model.AdminModel):
...
admin.site.register(Model, ModelAdmin)
Run Code Online (Sandbox Code Playgroud)
这是有效的,但在管理员网站上我只能看到我的模型不是来自Django管理员(用户和组)的模型.
如何永久覆盖admin.site并将所有模型注册到MyAdminSite?
来自myapp/admin.py:
from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin
from django.contrib.admin import AdminSite
from django.contrib import admin
from .models import MyModel #This is my app's model
# Custom admin site
class MyAdminSite(AdminSite):
site_header = 'My Project Title'
site_title = 'My Project Title Administration'
index_title = 'My Project Title Administration'
# You can add on more attributes if you need
# Check out https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#adminsite-objects
# Create admin_site object from MyAdminSite
admin_site = MyAdminSite(name='my_project_admin')
# Register the models
class MyModelAdmin(admin.ModelAdmin):
list_display = ('id', 'description')
admin_site.register(MyModel, MyModelAdmin)
# Create and register all of your models
# ....
# This is the default Django Contrib Admin user / group object
# Add this if you need to edit the users / groups in your custom admin
admin_site.register(Group, GroupAdmin)
admin_site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)
来自myproject/urls.py
from django.conf.urls import url
from django.contrib import admin
from myapp.admin import admin_site ##! Important..Import your object (admin_site) instead of your class (MyAdminSite)
urlpatterns = [
url(r'^admin/', admin_site.urls), #Now all /admin/ will go to our custom admin
]
Run Code Online (Sandbox Code Playgroud)
我没有找到解决问题的方法,但已采取了解决方法。
首先,我们需要在应用程序中创建模块(例如admin.py),然后扩展AdminSite类:
from django.contrib.admin import AdminSite
class MyAdminSite(AdminSite):
...
Run Code Online (Sandbox Code Playgroud)
然后,在模块底部,我们需要创建MyAdminSite的实例并从Django注册内置模型:
site = MyAdminSite()
site.register(Group, GroupAdmin)
site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)
必要进口:
from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin
Run Code Online (Sandbox Code Playgroud)
在我们的网站网址模块中,我们需要覆盖原始网站对象:
from .admin import site
admin.site = site
admin.autodiscover()
...
url(r'^admin/', admin.site.urls)
...
Run Code Online (Sandbox Code Playgroud)
我们需要做的最后更改是注册我们的模型。我们需要记住的一件事是,我们不能像这样使用register作为装饰器:
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
...
Run Code Online (Sandbox Code Playgroud)
要么:
@admin.site.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
...
Run Code Online (Sandbox Code Playgroud)
我们需要定义我们的ModelAdmin类,然后在MyAdminSite对象上调用register:
class MyModelAdmin(admin.ModelAdmin):
...
admin.site.register(MyModel, MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)
这是唯一对我有用的解决方案。
归档时间: |
|
查看次数: |
2550 次 |
最近记录: |