Django小部件模板覆盖不会在项目模板目录中搜索。怎么修?

时间:2017-10-19 17:28:48

标签: python django templates widget override

我试图在Django 1.11中覆盖内置的小部件模板。我似乎正在做文档在这方面要做的所有事情,但对于小部件模板,Django根本没有查看我的项目,并且我收到TemplateDoesNotExist错误。

这是我对覆盖的所有内容:

class MyFileWidget(widgets.FileInput):
    template_name = 'myapp/my_file_widget.html'

模板绝对存在。如果我将模板传递给渲染调用,它会发现它很好。问题是路径问题。从视图调用render时,它会检查以下内容:

projectroot /模板/ MyApp的/ my_file_widget.html djangoroot /形式/模板/ MyApp的/ my_file_widget.html

当它在我的项目中找到模板时,它会渲染它。当我在上面的类中提供模板路径时,不会发生这种情况。在这种情况下,它不检查我的项目模板,文件实际存在的位置,并开始检查django路径,而不是。因此错误信息。

所以我不知道为什么加载器会在渲染调用上检查我的项目模板,但是在查找" template_name"时却没有这样做。窗口小部件覆盖。有什么想法吗?

1 个答案:

答案 0 :(得分:18)

默认情况下,FORM_RENDERER设置默认为'django.forms.renderers.DjangoTemplates'

这会检查您应用的模板目录(例如projectroot/myapp/templates/myapp/my_file_widget.html),但不检查项目的模板目录(例如projectroot/templates/myapp/my_file_widget.html)。

如果您要使用与TEMPLATES设置相同的配置,则应使用TemplatesSetting渲染器。

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

您还需要更新TEMPLATES设置,以便Django仍然可以使用内置的窗口小部件模板。最简单的方法是将django.forms添加到INSTALLED_APPS。有关详细信息,请参阅the docs