如何根据每个请求 add/change django 模板文件夹?

How to add/change django template folder on per-request basis?

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

但很明显,我们想让我们的用户(在部署后的前几周内)选择是要试用新版本还是继续使用旧版本。好的,这很简单——我问一个用户并将他的答案放入他的会话中: request.session['new_design'] = True

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

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

所以无论在哪个视图中加载模板,都会首先搜索我全新的模板文件夹。 但我知道我不能即时修改设置

有没有其他方法可以存档相同的结果? 我考虑过子类化 filesystem.Loader...但是我怎样才能让它知道当前的 request/session 内容呢? 还有其他建议吗?

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

ps 再次说明:主要目标是触及任何视图!

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

编辑以添加另一个解决方案:

配置一个子域(例如:new.domain.tld),将另一个 settings.py 与您的新模板目录一起使用。如果您使用多域 cookie 来避免会话丢失,这应该有效。