2009-12-24 63 views
8

我使用选择render_to_response给TemplateDoesNotExist

paymenthtml = os.path.join(os.path.dirname(__file__), 'template\\payment.html') 

获取模板的路径,把它在 paymenthtml被复制到payment_template

return render_to_response(self.payment_template, self.context, RequestContext(self.request)) 

另一个应用程序,但我得到的错误

TemplateDoesNotExist在/ test-payment-url/

E:\ testapp \模板\ payment.html

为什么错误来了吗?

编辑:我在settings.py中做了以下更改,它能够找到模板,但我无法在生产中硬编码路径,有任何线索?

TEMPLATE_DIRS = ("E:/testapp") 

回答

21

Django似乎只会加载模板,如果它们位于您在TEMPLATE_DIRS中定义的目录中,即使它们存在于别处。

settings.py中试试这个:

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) 
# Other settings... 
TEMPLATE_DIRS = (
    os.path.join(PROJECT_ROOT, "templates"), 
) 

,然后在视图:

return render_to_response("payment.html", self.context, RequestContext(self.request)) 
# or 
return render_to_response("subdir/payment.html", self.context, RequestContext(self.request)) 

这使得无论是E:\path\to\project\templates\payment.htmlE:\path\to\project\templates\subdir\payment.html。重点在于它们位于我们在settings.py中指定的目录中。

+0

aha ,没有硬编码,我会试试这个,thx如此之多 – dhaval 2009-12-24 11:31:41

+5

这是一个可靠的方法,但我想添加一些关于Django如何加载模板的信息。它将按列出的顺序查看TEMPLATE_DIRS变量中列出的目录。它找到的第一个匹配将被使用。之后,Django将在app.templates下查看各种应用程序模块并从那里加载。 '级联'样式加载非常方便,可以有选择地替换可重用应用程序中的模板等。 – shawnr 2009-12-24 17:35:16

2

我没有django在这里,但我认为你应该使用/而不是\\?

蟒蛇帮助你有关跨操作系统的斜线

+0

我已经试过,只有然后张贴在这里,不起作用,thx求助,虽然 – dhaval 2009-12-24 06:57:04

1

一定这个文件存在于您的系统上?

E:\testapp\template\payment.html

此错误消息非常简单,当Django试图找到在文件系统中的路径你的模板文件,并不能看到可以看出。

如果文件确实存在,下一步是检查该文件和目录的权限以确保这不是权限问题。如果您的E:驱动器是某个网络共享的映射网络驱动器,那么您还需要检查共享权限。

+1

是该文件直接在浏览器打开,没有它的不允许的问题,其明显但不工作,因此不得不张贴帮助 – dhaval 2009-12-24 06:57:47

11

顺便说一句:棘手的是,即使渲染模板包含一个不存在的模板,django也会抛出TemplateDoesNotExist - 这个知识耗费了我一些时间和精力。

+2

只是一个路人想说:谢谢。 – 2016-03-30 23:23:26