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


我试图在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”时却无法这样做。有任何想法吗?


5974
2017-10-19 17:28


起源



答案:


默认情况下 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。看到 文档 有关这方面的更多信息。


15
2017-10-19 18:02



即将发布答案!那样做。仅供参考,我没有看到DjangoTemplates检查了我的任何项目模板。相反,似乎只关注Django模板,所以不知道那个位是正确的。另一个解决方案是在每个表单的基础上分配“default_renderer”,但当然,更改FORM_RENDERER是可取的。 - meesterguyperson
正如我所说, DjangoTemplates 不按设计检查项目模板。它应检查您的所有应用程序的模板目录 INSTALLED_APPS,不管他们是否 django.contrib 应用程序,第三方或项目的一部分。如果您要存储模板 projectroot/templates/myapp/my_file_widget.html,那听起来像 myapp 没有模板目录 projectroot/myapp/templates/ 去检查。 - Alasdair
啊,抓住了。我想我误会了。然后看起来不错。格拉西亚斯! - meesterguyperson


答案:


默认情况下 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。看到 文档 有关这方面的更多信息。


15
2017-10-19 18:02



即将发布答案!那样做。仅供参考,我没有看到DjangoTemplates检查了我的任何项目模板。相反,似乎只关注Django模板,所以不知道那个位是正确的。另一个解决方案是在每个表单的基础上分配“default_renderer”,但当然,更改FORM_RENDERER是可取的。 - meesterguyperson
正如我所说, DjangoTemplates 不按设计检查项目模板。它应检查您的所有应用程序的模板目录 INSTALLED_APPS,不管他们是否 django.contrib 应用程序,第三方或项目的一部分。如果您要存储模板 projectroot/templates/myapp/my_file_widget.html,那听起来像 myapp 没有模板目录 projectroot/myapp/templates/ 去检查。 - Alasdair
啊,抓住了。我想我误会了。然后看起来不错。格拉西亚斯! - meesterguyperson