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

mee*_*son 16 python django templates overriding widget

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

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

class MyFileWidget(widgets.FileInput):
    template_name = 'myapp/my_file_widget.html'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ala*_*air 22

默认情况下,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'
Run Code Online (Sandbox Code Playgroud)

您还需要更新您的TEMPLATES设置,以便Django仍然可以使用内置的小部件模板.要做到这一点,最简单的方法是添加django.formsINSTALLED_APPS.有关此内容的详细信息,请参阅文档.

  • 刚想发布答案!这样就可以了。仅供参考,我没有看到 DjangoTemplates 检查我的任何项目模板。相反,似乎只查看 Django 模板,所以不知道那一点是否正确。另一种解决方案是在每个表单的基础上分配“default_renderer”,但当然,更改 FORM_RENDERER 是更好的选择。 (2认同)