如何在Mezzanine多方租用中启用每站点模板

时间:2015-04-07 20:28:07

标签: django mezzanine multi-tenant

我们正在将业务扩展到欧洲,并且我使用Mezzanine的多租户功能在同一个Django安装上托管美国和欧盟版本的网站。根据{{​​1}},我们在每个网站上都有一个/locations页面,我希望根据不同的模板提供这些页面。

我已关注Mezzanine的稀疏文档here并将以下内容添加到SITE_ID

settings.py

我已在基本主题之后将HOST_THEMES = [ ('domain.com', 'domain_app'), ('domain.eu', 'domain_eu') ] 添加到domain_eu,并使用INSTALLED_APPS生成目录并手动创建python manage.py startapp domain_eu文件。

然后我复制了位置页面并将其分配到EU网站。

页面仍然使用位于基本主题中的位置模板进行渲染 domain_eu/templates/pages/locations.html

我已确认在请求中设置了正确的domain_app/templates/pages/locations.html

如何根据当前SITE_ID

在相应的主题/应用目录中使用模板呈现页面?

1 个答案:

答案 0 :(得分:3)

在深入了解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时,它会从正确的主题目录(在本地开发环境中)呈现模板