代码之家  ›  专栏  ›  技术社区  ›  kender DaveL

如何在Django项目中拥有两个不同的管理站点?

  •  15
  • kender DaveL  · 技术社区  · 14 年前

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

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

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

    我想在我的项目树中创建一个副本od django.contrib.auth appliaction,以不同的方式命名,并使用单独的 admin.site.register() 需要他们两个。这样我就可以在每一个模型中使用其他模型,不同的外观等。我不知道如何解决用户身份验证问题(我应该有不同的用户才能登录到CMS,然后进入后台)。

    以前有人这样做过,能给我一些提示吗?或者我计划做的只是设计上的错误?

    3 回复  |  直到 8 年前
        1
  •  8
  •   Ashique PS    9 年前

    要在不同的管理站点中注册模型,只需创建django.contrib.admin.sites.adminsite的不同实例, see this.

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

        2
  •  39
  •   Bernhard Vallant    8 年前

    您可以将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中的名称。

    然后你可以在你的应用程序中使用它 行政管理部门 和正常人一样 行政地点 实例:

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

    您还需要为它定义一些URL(在项目的 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

        3
  •  0
  •   Mike O'Connor    11 年前

    我不确定我的发现,报告在这里,将是完全有助于肯德,因为,除了其他事情,我不知道他说的不仅是两个管理网站,而且两个数据库,一个为每个。这就是我的处境。我有一个好主意,我希望我的一个应用程序,一个新的应用程序,有自己的数据库和管理页面。

    但是我遇到了BernhardVallant的Adminsite子类化方法的问题,尽管它看起来是正统的,而且本质上是正确的。我解决了这个问题。

    以下是我发现绝对必要的,对Bernhard Vallant的代码的修改:

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

    是的,我的意思是你选择的任何东西(只要不是“管理员”)。我用它来切换,每次都会失败,除了管理名称的分配。

    我得到的症状是,当我添加第二个数据库并为它创建了一个my admin,然后向my admin.register(my_model a)注册模型,然后查看两个admin应用程序页面,一个是我使用第二个数据库和my admin的新应用程序页面,另一个是my_model a模型,看起来不错,但我的旧admin页面显示了死lin对于它的模型,当我点击一个应用程序(使用旧数据库的旧应用程序)的非死链接时,我得到一个404代码,效果是页面不存在。

    另外,我不知道这很重要,但我做了一些不同于 Bernhard Vallant在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链接到的文档中有一些模糊的语言。

    对于URLCONF for MyNewApp,我有:

    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(小写)看起来像一个实例,而我不熟悉子类化实例。所以我想不是。