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

Django widget template override does not search in the project template directory. How to fix?

我正在尝试覆盖 Django 1.11 中的内置小部件模板。在这方面,我似乎做了文档所说的一切,但是对于小部件模板,Django 根本没有在我的项目中查找,我得到了一个 TemplateDoesNotExist 错误。

这是我要覆盖的内容:

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

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

projectroot/templates/myapp/my_file_widget.html djangoroot/forms/templates/myapp/my_file_widget.html

当它在我的项目中找到模板时,它会呈现它。当我在上面的 class 中提供模板路径时,这不会发生。在那种情况下,它不会检查我的项目模板,文件实际存在的地方,并开始检查 django 路径,它不存在的地方。因此出现错误消息。

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

默认情况下,FORM_RENDERER setting defaults to '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