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