render_to_response 给出 TemplateDoesNotExist
Posted
技术标签:
【中文标题】render_to_response 给出 TemplateDoesNotExist【英文标题】:render_to_response gives TemplateDoesNotExist 【发布时间】:2010-12-29 17:59:22 【问题描述】:我正在使用获取模板的路径
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 at /test-payment-url/
E:\testapp\template\payment.html
为什么会出现错误?
编辑:我在 settings.py 中进行了以下更改,它能够找到模板,但我无法在生产中对路径进行硬编码,有什么线索吗?
TEMPLATE_DIRS = ("E:/testapp" )
【问题讨论】:
【参考方案1】:似乎 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.html
或E:\path\to\project\templates\subdir\payment.html
。关键是它们位于我们在 settings.py 中指定的目录中。
【讨论】:
这是一个可靠的方法,但我想添加一些关于 Django 如何加载模板的信息。它将按照列出的顺序查找 TEMPLATE_DIRS 变量中列出的目录。它将使用它找到的第一个匹配项。之后,Django 将查看 app.templates 下的各种应用模块并从那里加载。 “级联”样式加载对于选择性地替换可重用应用程序中的模板等非常方便。【参考方案2】:顺便说一句:一个棘手的事情是,即使渲染的模板包含一个不存在的模板 - % include "some/template.html" %
,django 也会抛出 TemplateDoesNotExist
...这种知识让我花费了一些时间和精力。
【讨论】:
只是一个路人想说:谢谢。【参考方案3】:我这里没有 django,但我认为你应该使用 / 而不是 \\ ?
python 帮助您了解跨操作系统的斜线
【讨论】:
我都试过了,然后才在这里发布,不起作用,谢谢帮助【参考方案4】:您确定此文件存在于您的系统中吗?
E:\testapp\template\payment.html
此错误消息非常简单,当 Django 尝试通过文件系统上的路径查找您的模板文件但看不到它时会看到它。
如果文件确实存在,下一步是检查该文件和目录的权限,以确保这不是权限问题。如果您的E:
驱动器是某个网络共享的映射网络驱动器,那么您还需要检查共享权限。
【讨论】:
是的,文件直接在浏览器中打开,没有权限问题,很明显但不起作用,因此不得不发帖寻求帮助以上是关于render_to_response 给出 TemplateDoesNotExist的主要内容,如果未能解决你的问题,请参考以下文章
Django - render()、render_to_response() 和 direct_to_template() 有啥区别?
如果 render_to_response 方法没有包含在任何地方,为啥我会收到 ImportError?
django 在 render_to_response() 后注销我