如何在夹层多租户中启用每个站点的模板

How to enable per-site templates within Mezzanine multi-tenancy

我们正在将业务扩展到欧洲,我正在使用 Mezzanine 的多租户功能在同一个 Django 安装上托管美国和欧盟版本的站点。我们在每个网站上都有一个 /locations 页面,我想根据 SITE_ID 使用不同的模板提供服务。

我遵循了 Mezzanine 的稀疏文档 here 并将以下内容添加到 settings.py

HOST_THEMES = [
    ('domain.com', 'domain_app'), 
    ('domain.eu', 'domain_eu')
]

我在基本主题之后添加了domain_euINSTALLED_APPS,并使用python manage.py startapp domain_eu生成了目录并手动创建了domain_eu/templates/pages/locations.html 文件.

然后我复制了位置页面并将其分配给欧盟站点。

页面仍使用位于 基本主题 domain_app/templates/pages/locations.html

中的位置模板呈现

我已确认在请求中设置了正确的 SITE_ID

如何根据当前的SITE_ID在相应的theme/app目录下使用模板渲染页面?

在深入研究 Mezzanine 的代码后,我发现了为什么我的 eu 主题模板没有呈现。代码的关键部分可以在 mezzanine/utils/sites.py

中找到
def host_theme_path(request):
    """
    Returns the directory of the theme associated with the given host.
    """
    for (host, theme) in settings.HOST_THEMES:
        if host.lower() == request.get_host().split(":")[0].lower():

当我记录 request.get_host() 的结果时,我很快意识到了这个问题,因为它是 localhost,显然不匹配任何 HOST_THEMES 域。

我曾假设 Mezzanine 会根据 their documentation 使用会话变量 site_id 但显然不会沿着这个特定的模板呈现代码路径。

解决方案 因此只需使用以下内容编辑我的 /etc/hosts 文件:

127.0.0.1 domain.eu

现在,当我访问 domain.eu/locations 时,它会从正确的主题目录(在本地开发环境中)呈现模板