2010-07-08 50 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來說非常混亂,因爲管理員用小寫字母看起來像一個實例,而我不熟悉子類實例。所以我認爲它不是。

相關問題