2013-08-20 35 views
2

我試圖在兩個不同的域上運行django-cms。爲此,我創建了兩個域(django.contrib.sites)並將它們添加到它們django-cms頁面。 現在,我創建了一個SiteDetectionMiddleware:Django-CMS:同一個項目上的多個域

class SiteDetectionMiddleware: 
    def process_request(self, request): 
    settings.SITE_ID = 1 
    host = request.META.get('HTTP_HOST') 
    if host: 
     try: 
     site = Site.objects.get(domain=host) 
     settings.SITE_ID = site.id 
     except Site.DoesNotExist: 
     pass 

它似乎正常工作,當我調用瀏覽器的網站重啓動Apache後的第一次。然後我改變到其他網站,並得到了NoReverseMatch錯誤。

有沒有人有一個想法什麼可能是錯的?

我認爲這應該在django-cms中開箱即用?

關於科林

回答

6

你爲什麼要設置靜態SITE_ID?你應該根據項目的差異,例如可能要創建兩個設置文件,並使用某種形式的繼承:

local_settings.py(未版本控制之下擁有像數據庫密碼和密鑰敏感數據)

SECRET_KEY = '[email protected]$1AJFS78787124!897zR81' 

settings.py(認爲是相等的兩個站點設置)

# preferably at the bottom 
try: 
    from local_settings import * 
except ImportError: 
    pass 

settings_foo.py(保持特定設置到站點1)

from settings import * 

SITE_ID = 1 

settings_bar.py(保持特定設置,以位點2)

from settings import * 

SITE_ID = 2 

settings_deployment_foo.py(覆蓋變量用於生產)

from settings_foo import * 

DEBUG = False 

settings_deploy ment_bar.py(覆蓋變量用於生產)

from settings_bar import * 

DEBUG = False 

然後,只需內​​創建兩個網站,或使用夾具(假設您共享數據庫跨越這些項目你只有做一次)。

+0

謝謝,這有很大的幫助。 :) +1 – cwirz

+1

@Hedde van der Heide我們如何根據類型url動態地爲每個網站加載各自的settings.py。 – bhushya

+0

@Wirzi你如何根據站點ID動態加載'settings_foo.py'和'settings_bar.py'? – bhushya

1

經過幾個小時的反覆試驗,我得到了以下解決方案。

我們需要保持的SITECMS_LANGUAGES之間

例如關係,我有一個網站ID 1兩個站點abc.comxyz.com帶有網站ID 2

所以你需要提到以下在settings.py

CMS_LANGUAGES = { 
     ## Customize this 
     'default': { 
      'public': True, 
      'hide_untranslated': False, 
      'redirect_on_fallback': True, 
     }, 
     1: [ 
      { 
       'public': True, 
       'code': 'en', 
       'hide_untranslated': False, 
       'name': gettext('en'), 
       'redirect_on_fallback': True, 
      }, 
      { 
       'public': True, 
       'code': 'zh', 
       'hide_untranslated': False, 
       'name': gettext('zh'), 
       'redirect_on_fallback': True, 
      }, 
      { 
       'public': True, 
       'code': 'my', 
       'hide_untranslated': False, 
       'name': gettext('my'), 
       'redirect_on_fallback': True, 
      }, 
     ], 
     2: [ 
      { 
       'public': True, 
       'code': 'en', 
       'hide_untranslated': False, 
       'name': gettext('en'), 
       'redirect_on_fallback': True, 
      }, 
      { 
       'public': True, 
       'code': 'zh', 
       'hide_untranslated': False, 
       'name': gettext('zh'), 
       'redirect_on_fallback': True, 
      }, 
      { 
       'public': True, 
       'code': 'my', 
       'hide_untranslated': False, 
       'name': gettext('my'), 
       'redirect_on_fallback': True, 
      }, 
     ], 
    } 

的關係我也使用site中間件,它使用域名檢測站點ID。

我希望它可以幫助別人:)

2

如果你的語言是相同像xyz.comabc.com

因此,你可以在中間件處理它所有的域,所以中間件可以分配可用的語言在運行時子域。

from django.conf import settings 
from django.contrib.sites.models import Site 

class SiteMiddleware(object): 
    def process_request(self, request): 
     try: 
      current_site = Site.objects.get(domain=request.get_host()) 
     except Site.DoesNotExist: 
      current_site = Site.objects.get(id=settings.DEFAULT_SITE_ID) 

     request.current_site = current_site 
     settings.SITE_ID = current_site.id 
     settings.SITE_NAME = current_site.name 
     if settings.SITE_ID is not 1: 
      settings.CMS_LANGUAGES[settings.SITE_ID] = settings.CMS_LANGUAGES[1]