2010-07-08 52 views
14

我想在Django项目中有2个独立的管理网站。如何在Django项目中拥有2个不同的管理站点?

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

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

我想过只是在我的项目树中创建一个od django.contrib.auth appliaction副本,命名方式不同,并且使用两个独立的admin.site.register()调用。通过这种方式,我可以在其中的每一个模型中使用其他模型,不同的外观等等。我不知道如何解决用户身份验证问题(我应该让不同的用户能够登录到CMS然后进入BackOffice) 。

任何人都碰巧做到这一点,可以给我一些提示?或者我打算做什么只是错误的设计?

回答

7

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

您将很乐意与两个不同的管理站点管理不同的模型并使用不同的模板。 对于身份验证和权限,您应该可以像使用自定义权限一样使用内置django.contrib.auth(希望其他人能够在此处提供帮助)

+1

当我尝试执行此操作时,在登录后,我收到“您无权编辑任何内容”。消息... – kender 2010-07-08 20:31:52

+3

您使用的用户应该将is_staff和is_superuser字段设置为true。然后区分不同的管理员用户和他们有权访问http://docs.djangoproject.com/en/1.2/topics/auth/#permissions – 2010-07-09 08:42:55

+0

好吧,我得到了这个工作。但我似乎无法为两个管理员站点设置不同的模板集合 - 他们都在模板中查找'admin /'目录,即使其中一个是使用'backoffice'参数创建的,该参数应该将其名称设置为'backoffice '... – kender 2010-07-09 20:34:19

38

你也可以继承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

+0

管理网站的快速示例 – 2012-08-03 09:34:12

0

我不确定我的发现,据报道,这对kender完全有帮助,因为除了别的以外,我不知道他是不是在谈论两个管理站点,而是两个数据库,每个数据库一个。那是我的情况。我明白了,我想让我的一个应用程序(一款新应用程序)拥有自己的数据库和自己的管理页面。

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

这里的MOD到伯恩哈德Vallant的代码,我认为是完全必要的:

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

是的,我真的是名=“什么”,你选择(只要它不是“管理“)。而且我用它切换进出,每次都没有任何管理员名称分配失败。

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

另外,我不知道它的问题,但我做了一些不同的东西从什么 伯恩哈德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)), 
) 

OK,“someword”无关---那里关于最终用户的外观,而不是应用程序或项目的名称。但关联的管理员是我的旧应用程序和旧数据库的管理员。注意autodiscover()包含。 Bernhard Vallant在项目urlconf配置为Bernhard Vallant时使用的文档中存在一些模糊的语言,它将其与myadmin导入结合使用,并且还提供了对默认管理员的引用。

而对于URL配置为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实例不是“管理”其他东西的绝对必要性,我必须补充一点,当是时候爵士乐的mynewapp的admin.py文件与一些admin.ModelAdmin子类,有必要确实使用admin.ModelAdmin作为父类。 myadmin毕竟是AdminSite子类的一个实例。正因为如此,我认为它与admin.site相同,而不是admin。

这对于像我这样的NOOB来说非常混乱,因为管理员用小写字母看起来像一个实例,而我不熟悉子类实例。所以我认为它不是。

相关问题