我正在尝试在Django管理员中创建自定义小部件。我创建了一个类:
class FroalaWYSIWYGTextareaWidget(django.forms.widgets.Textarea):
template_name = 'froala_wysiwyg.html'
然后是一个简单的模型形式:
class ArticleForm(django.forms.ModelForm):
class Meta:
fields = '__all__'
model = Article
widgets = {
'content': FroalaWYSIWYGTextareaWidget(),
}
以下是我的设置:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_PATH, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django.template.context_processors.i18n',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Usualy一切正常,Django可以在我的/ templates /目录中找到模板但是在这个小部件的情况下我有500错误:
TemplateDoesNotExist at /admin/article/article/1/change/
froala_wysiwyg.html
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/article/article/1/change/
Django Version: 1.11.4
Exception Type: TemplateDoesNotExist
Exception Value: froala_wysiwyg.html
Exception Location: /home/username/.virtualenvs/sitename/lib/python3.5/site-packages/django/template/engine.py in find_template, line 148
Python Executable: /home/username/.virtualenvs/sitename/bin/python
Python Version: 3.5.2
我调试了django.filesystem.loader并发现通常Loader.engine.dirs是一个列表:
['/home/username/python/sitename/templates']
所以Loader.get_template_sources()效果很好
但是在这个自定义小部件的情况下,这个loader.engine.dirs仅包含:
['/home/username/.virtualenvs/sitename/lib/python3.5/site-packages/django/forms/templates']
因此,它只是忽略设置中的DIRS
选项,而是使用表单/模板。这是Django的错误还是我必须在设置中更改某些内容?
我不明白这条django/forms/templates
路径来自哪里?
感谢。
答案 0 :(得分:9)
它当然不是一个错误
我不明白这个django / forms / templates路径来自哪里?
您可以查看source code您可以在哪里看到
行[docs]class Textarea(Widget):
template_name = 'django/forms/widgets/textarea.html'
这是你第一个问题的来源。现在第二个
此渲染器使用独立的DjangoTemplates引擎(未连接到您在TEMPLATES设置中配置的内容)。它首先从django / forms / templates中的内置表单模板目录加载模板,然后使用app_directories加载器从已安装的应用程序模板目录中加载模板。
对于表单窗口小部件类也是如此。为了使您的自定义窗口小部件模板正常工作,您必须指定具有相同术语的路径,例如app_name/forms/widget/textarea.html
答案 1 :(得分:8)
如果您想使用存储在" TEMPLATES"下的某个自定义窗口小部件模板。然后按照以下步骤操作项目目录:
a)使用您在问题中提供的TEMPLATES
设置
b)在FORM_RENDERER
settings.py
,如下所示
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
c)添加应用程序" django.forms
"到了INSTALLED_APPS
'列表settings.py
另外,请务必为自己的" TEMPLATES
"分配自定义小部件模板的正确路径。目录到" template_name
"自定义小部件的属性。