如何根据每个请求 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 来避免会话丢失,这应该有效。
我们刚刚开始完全重新设计我们项目的 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 来避免会话丢失,这应该有效。