【问题标题】:Django widget template override does not search in the project template directory. How to fix?Django 小部件模板覆盖不在项目模板目录中搜索。怎么修?
【发布时间】:2018-03-31 19:55:36
【问题描述】:

我正在尝试覆盖 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

当它在我的项目中找到模板时,它会渲染它。当我在上面的类中提供模板路径时,这不会发生。在这种情况下,它不会签入我的项目模板(该文件实际存在的位置),并开始签入 django 路径,但它不存在。因此出现错误消息。

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

【问题讨论】:

    标签: python django templates widget overriding


    【解决方案1】:

    默认情况下,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

    【讨论】:

    • 正要发布答案!这样就可以了。仅供参考,我没有看到 DjangoTemplates 检查了我的任何项目模板。相反,似乎只看Django模板,所以不知道那一点是否正确。另一种解决方案是在每个表单的基础上分配“default_renderer”,但当然,最好更改 FORM_RENDERER。
    • 正如我所说,DjangoTemplates 不会按设计检查您的项目模板。它应该检查INSTALLED_APPS 中所有应用程序的模板目录,无论它们是django.contrib 应用程序、第三方还是项目的一部分。如果您将模板存储在projectroot/templates/myapp/my_file_widget.html 中,那么听起来myapp 没有要检查的模板目录projectroot/myapp/templates/
    • 啊,明白了。我想我误解了。然后看起来不错。谢谢!
    猜你喜欢
    • 2017-11-24
    • 2018-06-21
    • 2021-04-06
    • 1970-01-01
    • 2015-04-15
    • 2017-05-28
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多