如何根据请求添加/更改django模板文件夹?

时间:2015-02-26 14:18:32

标签: django django-templates django-middleware

我们刚刚开始完全重新设计项目的HTML页面(响应式布局和内容),我们需要更改的是模板和静态(css和一些js)。 观点根本不会发生变化。 我想在现有旧文件夹旁边的另一个文件夹中创建所有新模板,例如“新模板”,所以当工作完成后,我们只需更改我们的TEMPLATE_DIRS设置就可以了。

但显然我们希望让我们的用户(在部署之后的前几周)选择是否要尝试新版本或者保留旧版本。好的,这很简单 - 我问用户并将他的答案放入他的会话中: request.session['new_design'] = True

现在在一些自定义中间件中写这样的东西会很好:

if request.session.get('new_design', False):
    settings['TEMPLATE_DIRS'] = (MY_NEW_TEMPLATE_DIR, ) + settings['TEMPLATE_DIRS']

因此,无论在任何视图中加载模板,都会首先搜索我的全新模板文件夹。 但我知道我无法动态修改设置

有没有其他方法可以存档相同的结果? 我想过将子类化文件系统.Loader ...但是如何才能让它知道当前的请求/会话内容? 还有其他建议吗?

UPD:我忘了提及:子域名已经用于城市选择,例如: la.domain.tld仅代表LA用户可用的对象。所以添加第四个子域并不是那么好。

ps再一次只是说清楚:主要目标是来触摸任何视图!

1 个答案:

答案 0 :(得分:1)

我认为您必须创建自己的模板加载器(请参阅https://docs.djangoproject.com/en/1.7/ref/settings/#template-loaders)。 由于您需要在自定义模板加载器中获取请求,因此可以将其作为全局值,如下所述:https://stackoverflow.com/a/27694861/983222

编辑以添加其他解决方案:

配置一个子域(例如:new.domain.tld),该子域使用其他settings.py和新模板目录。如果您使用多域cookie来避免会话丢失,这应该可行。