2017-10-19 119 views
2

我正在尝试重写Django 1.11中内置的小部件模板。我似乎正在做文档在这方面所做的一切,但对于小部件模板,Django根本不在我的项目中查看,并且出现TemplateDoesNotExist错误。Django窗口小部件模板覆盖不会在项目模板目录中搜索。怎么修?

下面是我对越权:

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

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

projectroot /模板/ MYAPP/my_file_widget.html djangoroot /表格/模板/ MYAPP/my_file_widget.html

当它发现在我的项目模板,它呈现它。当我在上面的类中提供模板路径时,这不会发生。在这种情况下,它不会检查我的项目模板,该文件实际存在于何处,并开始在django路径中检查,而不检查它。因此错误信息。

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

回答

5

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

您还需要使Django的仍然可以使用内置的小工具模板来更新您的TEMPLATES设置。最简单的方法是将django.forms添加到INSTALLED_APPS。有关详细信息,请参阅the docs

+0

刚才发表了一个答案!这将做到这一点。仅供参考,我没有看到DjangoTemplates检查了我的任何项目模板。相反,似乎只看Django模板,所以不知道那一点是正确的。另一种解决方案是在每个表单的基础上分配“default_renderer”,但当然,更改FORM_RENDERER是可取的。 – meesterguyperson

+1

正如我所说的,'DjangoTemplates'不会按设计检查您的项目模板。它应该检查“INSTALLED_APPS”中所有应用程序的模板目录,而不管它们是否是'django.contrib'应用程序,第三方或您的项目的一部分。如果您将模板存储在'projectroot/templates/myapp/my_file_widget.html'中,那么它听起来像'myapp'没有模板目录'projectroot/myapp/templates /'来检查。 – Alasdair

+0

啊,呃。我想我误解了。然后看起来不错。格拉西亚斯! – meesterguyperson