【问题标题】:How to have 2 different admin sites in a Django project?如何在 Django 项目中拥有 2 个不同的管理站点?
【发布时间】:2011-03-13 12:29:33
【问题描述】:

我想在一个 Django 项目中拥有 2 个独立的管理站点。

我的意思是分开 - 他们应该有单独的用户身份验证,他们应该管理不同的模型,并有不同的外观和 URL。

我想要这样做的原因是客户想要单独的部分来管理页面的 CMS 部分,并单独用作“后台”解决方案。

我想在我的项目树中制作一个副本 od django.contrib.auth 应用程序,以不同的方式命名它并为它们使用单​​独的admin.site.register() 调用。这样我就可以在每个模型中使用其他模型,不同的外观等。我不知道如何解决用户身份验证问题(我应该有不同的用户才能登录 CMS,然后登录 BackOffice) .

以前有人碰巧这样做过,可以给我一些提示吗?或者我打算做的只是设计错误?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您可以继承 Django 的 AdminSite(例如,将其放在项目根目录中的 admin.py 中):

    from django.contrib.admin.sites import AdminSite
    
    class MyAdminSite(AdminSite):
        pass
        #or overwrite some methods for different functionality
    
    myadmin = MyAdminSite(name="myadmin")   
    

    至少从 1.9 开始,您需要添加 name 参数才能使其正常工作。这用于创建反向 url,因此名称必须是 urls.py 中的名称。

    然后你可以在你的应用程序的admin.py 中使用它,就像你使用普通的AdminSite 实例一样:

    from myproject.admin import myadmin
    myadmin.register(MyModel_A)
    

    您还需要为它定义一些网址(在您的项目的urls.py 中):

    from myproject.admin import admin, user_site
    from myproject.admin import myadmin
    urlpatterns = patterns('',
        ...
        (r'^admin/', include(admin.site.urls)),
        (r'^myadmin/', include(myadmin.urls)),
    

    另见:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adminsite-objects

    【讨论】:

    • 如何在 InstalledApps 中注册 MyAdminSite?基本上,我有租户和共享应用程序。创建了管理员的新实例,并且只需要将这个新实例注册到共享应用程序。
    【解决方案2】:

    要在不同的 AdminSites 中注册模型,您只需创建不同的 django.contrib.admin.sites.AdminSite 实例,see this.

    您最好使用两个不同的管理站点来管理不同的模型并拥有不同的模板。 对于身份验证和权限,您应该能够使用内置的 django.contrib.auth 和自定义权限(希望其他人能够在这里提供更多帮助)

    【讨论】:

    • 当我尝试执行此操作时,在我登录后,我收到“您无权编辑任何内容”。消息...
    • 您使用的用户应该将 is_staff 和 is_superuser 字段设置为 true。然后在区分不同的admin用户和他们有什么访问权限之后就可以看到docs.djangoproject.com/en/1.2/topics/auth/#permissions
    • 好的,我得到了这个工作。但我似乎无法为 2 个管理站点提供不同的模板集 - 它们都在模板中查找“admin/”目录,甚至一个是使用“backoffice”参数创建的,它应该将其名称设置为“backoffice” '...
    【解决方案3】:

    我不确定我在这里报告的发现是否会对 kender 完全有帮助,因为除其他外,我不知道他是否不仅在谈论两个管理站点,而且还谈论两个数据库,一个用于每个。这就是我的情况。我有了一个好主意,我希望我的一个应用程序,一个新应用程序,拥有自己的数据库和管理页面。

    但是我遇到了 Bernhard Vallant 的 AdminSite 子类化方法的问题,尽管这似乎是正统且本质上正确的做法。我解决了这个问题。

    这是我认为非常必要的 Bernhard Valant 代码的 mod:

    from django.contrib.admin.sites import AdminSite
    class MyAdminSite(AdminSite):
        pass
        #or overwrite some methods for different functionality
    myadmin = MyAdminSite(name='anything')
    

    是的,我的意思是您选择的 name='anything'(只要不是 'admin')。而且我已经使用它进行了切换,但每次都失败了,但没有分配管理员名称。

    我得到的症状是,当我添加第二个数据库并为其创建一个 myadmin,然后使用 myadmin.register(My_ModelA) 注册模型时,我去查看两个管理应用程序页面,一个是我的使用第二个数据库和 myadmin 的新应用程序和模型 My_ModelA 看起来不错,但是我的旧管理页面显示其模型的死链接,当我单击应用程序的非死链接时(使用旧数据库的旧应用程序) ) 我得到了一个 404 代码,表明该页面不存在。

    另外,我不知道这很重要,但我做了一些不同的事情 Bernhard Valant 在项目 urlconf 中所做的:

    from django.conf.urls import patterns, include, url
    from django.contrib import admin
    admin.autodiscover()
    
    urlpatterns = patterns('',
        url(r'^admin/', include('mynewapp.urls')),
        url(r'^someword/admin/', include(admin.site.urls)),
    )
    

    好的,“someword”是无关紧要的——那里是关于最终用户的外观,而不是应用程序或项目的名称。但是关联的管理员是我的旧应用程序和旧数据库的管理员。注意 autodiscover() 包含。在将项目 urlconf 配置为 Bernhard Vallant 使用 myadmin 导入但也引用默认管理员时,Bernhard Vallant 链接到的文档中有一些模糊的语言。

    对于 mynewapp 的 urlconf,我有:

    from django.conf.urls import patterns, url, include
    from myproject.admin import myadmin
    
    urlpatterns = patterns('',
        url(r'/', include(myadmin.urls) )
    )
    
    urlpatterns += patterns('mynewapp.views',"... url() stuff for mynewapp's views"),
    )
    

    尽管完全有必要在内部将 AdminSite 实例命名为“admin”以外的名称,但我必须补充一点,当需要使用一些 admin.ModelAdmin 子类来使 mynewapp 的 admin.py 文件更加生动时,确实有必要使用 admin.ModelAdmin 作为父类。 myadmin 毕竟是 AdminSite 子类的一个实例。因此,我认为它与 admin.site 相当,而不是 admin。

    对于像我这样的 NOOB 来说,这一切都非常令人困惑,因为小写的 admin 看起来像一个实例,而我不熟悉子类化实例。所以我认为不是。

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 1970-01-01
      • 2012-06-09
      • 2011-08-02
      • 2013-02-04
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多