Джанго. 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

Если вы хотите использовать собственный шаблон виджета, который хранится где-то в вашем каталоге "ШАБЛОНЫ" вашего проекта, выполните следующие действия:

  1. Используйте настройки 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 ',],},},]

  2. Установите FORM_RENDERER как указано в settings.py

    FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

  3. Добавьте приложение "django.forms" в список "INSTALLED_APPS" в settings.py

Кроме того, не забудьте указать правильный путь шаблона пользовательского виджета относительно вашего каталога "ШАБЛОНЫ" к атрибуту "template_name" вашего настраиваемого виджета.