Джанго. TemplateDoesNotExist в случае пользовательского виджета
Я пытаюсь создать собственный виджет в администраторе 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',
],
},
},
]
Обычно все работает отлично, и 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
? Благодарю.
Ответы
Ответ 1
Это, конечно, не ошибка
Я не понимаю, откуда этот путь django/forms/templates?
Вы можете просмотреть исходный код, где вы можете увидеть строку
[docs]class Textarea(Widget):
template_name = 'django/forms/widgets/textarea.html'
Это стало вашим первым вопросом. Теперь второй
Этот рендерер использует автономный механизм DjangoTemplates (не связанный с тем, что вы могли бы настроить в настройке TEMPLATES). Он загружает шаблоны сначала из встроенного шаблона шаблонов форм в django/forms/templates, а затем из установленных шаблонов шаблонов приложений, используя загрузчик app_directories.
Это справедливо и для классов виджета формы. Чтобы заставить работать пользовательский шаблон виджета, вы должны указать путь с той же терминологией, как app_name/forms/widget/textarea.html
Ответ 2
Если вы хотите использовать собственный шаблон виджета, который хранится где-то в вашем каталоге "ШАБЛОНЫ" вашего проекта, выполните следующие действия:
-
Используйте настройки TEMPLATES, которые вы указали в своем вопросе (повторяется ниже):
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 ',],},},]
-
Установите FORM_RENDERER как указано в settings.py
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
- Добавьте приложение "django.forms" в список "INSTALLED_APPS" в settings.py
Кроме того, не забудьте указать правильный путь шаблона пользовательского виджета относительно вашего каталога "ШАБЛОНЫ" к атрибуту "template_name" вашего настраиваемого виджета.