2

我正在尝试在两个不同的域上运行 django-cms。为此,我创建了两个域 (django.contrib.sites) 并将 django-cms 页面添加到其中。现在我创建了一个 SiteDetectionMiddleware:

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 中开箱即用?

关于科林

4

3 回答 3

6

你为什么要设置SITE_ID静态?您可能应该创建两个设置文件并根据项目差异使用某种形式的继承,例如:

local_settings.py(不受版本控制,包含数据库密码和密钥等敏感数据)

SECRET_KEY = 'as!sfhagfsA@$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_deployment_bar.py(覆盖生产变量)

from settings_bar import *

DEBUG = False

然后只需在其中创建两个站点admin/sites或使用固定装置(假设您正在跨这些项目共享数据库,您只需执行一次)。

于 2013-08-20T07:49:20.240 回答
3

如果您的语言对于所有域都相同,例如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]
于 2015-03-04T13:35:05.417 回答
1

经过几个小时的反复试验,我得到了以下解决方案。

SITE我们需要保持和之间的关系CMS_LANGUAGES

例如,我有两个站点abc.com,站点 ID 为 1 xyz.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。

我希望它可以帮助某人:)

于 2015-03-03T13:29:32.940 回答