为了测试自定义模板标签,我需要测试一个返回渲染模板的函数。为了能够比较输出而不必了解用户生成的生产模板(不时更改),我尝试覆盖 TEMPLATE_DIRS 设置。看起来像是 Django 1.4 的新 override_settings 装饰器的完美使用场景:
@override_settings(TEMPLATE_DIRS='%s/templates' % os.path.abspath(os.path.dirname(__file__)) )
def test_render_as_list(self):
self.node.type = 'list'
self.node.listtemplate = 'testtemplate.html'
self.node.items = ['a', 'b', 'c']
# these lines print the correct path to the template
from django.conf import settings
print(settings.TEMPLATE_DIRS)
# inserted debug trace here
import ipdb;ipdb.set_trace()
response = render_as_list(self.node, self.context)
self.assertEqual(response,'item a, item b, item c')
这是我的目录结构的样子:
- project
- app_to_test
- fixtures
- templatetags
- tests
__init__.py
test_templatetags.py (containing the test shown above)
templates
testtemplate.html
据我了解我的代码,settings.TEMPLATE_DIRS 现在应该指向
/some/path/project/app_to_test/tests/templates
打印新 settings.TEMPLATE_DIRS 值的行显示装饰器工作,但 render_as_list 函数仍然返回
TemplateDoesNotExist:testtemplate.html
几个小时以来,我一直坚持这一点,只是找不到其他可以尝试的方法。
编辑: 路径创建工作,文件存在,但 Django 仍然不加载模板:
ipdb> from django.conf import settings
ipdb> path = settings.TEMPLATE_DIRS
ipdb> templatename = path+'testtemplate.html'
ipdb> templatename
'/Volumes/Data/project/my_app/tests/templates/testtemplate.html'
ipdb> template.loader.get_template(templatename)
*** TemplateDoesNotExist: /Volumes/Data/project/my_app/tests/templates/testtemplate.html
ipdb> f = file(templatename)
ipdb> f
<open file '/Volumes/Data/project/my_app/tests/templates/testtemplate.html', mode 'r' at 0x102e95d78>
ipdb> f.read()
'testtemplate content'