Django(1.10)覆盖AdminSi

2024-09-29 23:16:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用我自己的自定义类重写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

然后在我的应用程序中网址.py我补充道:

^{pr2}$

它似乎可以工作,但是管理模型注册到adminisite而不是MyAdminSite。在

我尝试了三种方法将模型注册到我的自定义站点:

@admin.register(Model)
class ModelAdmin(model.AdminModel):
...

这样模型就注册到原始的adminisite。在

第二种方法:

@admin.site.register(Model):
class ModelAdmin(model.AdminModel):
...

这不起作用,会引起例外。ModelAdmin类未传递给register方法。在

最后一条路:

class ModelAdmin(model.AdminModel):
...
admin.site.register(Model, ModelAdmin)

这是可行的,但在管理网站上,我只能看到我的模型,而不是Django管理员(用户和组)的模型。在

我怎样才能永久地覆盖管理站点把所有模型注册到MyAdminSite?在


Tags: django方法模型registermodeladmin站点contrib
3条回答

从myapp/管理员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)

从我的项目/网址.py在

^{pr2}$

我也面临着类似的问题。我使用了django2.1和上面的评论中的the hook对我不起作用。我也不能导入GroupAdmin和UserAdmin,就像这样

from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin

由于某种原因,导入GroupAdmin或UserAdmin会破坏代码。我无法确定确切的原因。在

所以我的解决方法是(在project/urls.py)中:

^{pr2}$

这里的想法是从默认管理站点复制注册的模型。也许这样做不好,但我找不到其他有效的方法。在

我没有找到解决问题的办法,但我已经找到了解决办法。在

首先我们需要在我们的应用程序中创建模块(例如。管理员py)然后扩展类AdminSite:

from django.contrib.admin import AdminSite

class MyAdminSite(AdminSite):
    ...

然后在模块的底部,我们需要创建myadminisite的实例并从Django注册内置模型:

^{pr2}$

必要进口:

from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin

在我们的站点url模块中,我们需要重写原始站点对象:

from .admin import site

admin.site = site
admin.autodiscover()
...
url(r'^admin/', admin.site.urls)
...

我们需要做的最后一个改变是注册我们的模型。我们需要记住的一点是,我们不能像那样使用register作为装饰器:

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    ...

或者:

@admin.site.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    ...

我们需要定义ModelAdmin类,然后调用MyAdminSite对象上的register:

class MyModelAdmin(admin.ModelAdmin):
    ...
admin.site.register(MyModel, MyModelAdmin)

这是唯一对我有用的解决方案。在

相关问题 更多 >

    热门问题