我试图在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"时却没有这样做。窗口小部件覆盖。有什么想法吗?
答案 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。