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

时间:2010-07-08 18:40:45

标签: django django-admin

我希望在Django项目中有2个独立的管理站点。

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

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

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

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

3 个答案:

答案 0 :(得分:39)

您可以将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

答案 1 :(得分:8)

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

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

答案 2 :(得分:0)

我不确定我在这里报道的发现是否对kender完全有帮助,因为除其他事项外,我不知道他是不是在谈论两个管理站点,还有两个数据库,一个用于每。那是我的情况。我明白我想要一个我的应用程序,一个新的应用程序,拥有自己的数据库和自己的管理页面。

但是我遇到了Bernhard Vallant的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')

是的,我的意思是你选择的名字='任何'(只要它不是'admin')。而且我已经用它进行切换,并且每次都没有任何 - 但是 - 管理员的名字分配,它就会失败。

我获得的症状是,当我添加第二个数据库并为其创建myadmin然后使用myadmin.register(My_ModelA)注册模型,然后去查看两个管理应用页面,一个用于我的使用第二个数据库和myadmin的新应用程序和模型My_ModelA看起来很好,但是我的旧管理页面显示了其模型的死链接,当我在应用程序的非死链接上点击时(一个使用旧数据库的旧应用程序)我得到了一个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”无关紧要---关于最终用户的外观,而不是应用程序或项目的名称。但关联的管理员是我的旧应用程序和旧数据库的管理员。请注意自动发现()包含。当项目urlconf配置为Bernhard Vallant时,Bernhard Vallant将文档中的一些模糊语言用于myadmin导入,并且还引用了默认管理员。

对于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文件进行jazz时,确实有必要使用admin.ModelAdmin作为父类。 myadmin毕竟是AdminSite子类的一个实例。因此,我认为它与admin.site相同,而不是与admin。

这对于像我这样的NOOB来说非常混乱,因为带小写的admin看起来像一个实例,而且我不熟悉子类化实例。所以我认为不是。