web-dev-qa-db-ja.com

Django。カスタムウィジェットの場合はTemplateDoesNotExist

Django adminでカスタムウィジェットを作成しようとしています。クラスを作成しました:

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パスはどこから来たの?ありがとう。

19
MrBinWin

それは確かにバグではありません

このDjango/forms/templatesパスがどこから来ているのかわかりませんか?

あなたは ソースコード あなたが行を見ることができるところを見ることができます

[docs]class Textarea(Widget):
    template_name = 'Django/forms/widgets/textarea.html'

これがあなたの最初の質問の源でした。今2番目のもの

このレンダラーは、スタンドアロンのDjangoTemplatesエンジンを使用します(TEMPLATES設定で構成したものとは接続されていません)。最初にDjango/forms/templatesの組み込みのフォームテンプレートディレクトリからテンプレートをロードし、次にapp_directoriesローダーを使用してインストールされたアプリのテンプレートディレクトリからテンプレートをロードします。

これは、フォームウィジェットクラスにも当てはまります。カスタムウィジェットテンプレートで機能させるには、app_name/forms/widget/textarea.htmlのような同じ用語でパスを指定する必要があります。

9
Arpit Solanki

プロジェクトの「TEMPLATES」ディレクトリの下に保存されているカスタムウィジェットテンプレートを使用する場合は、次の手順に従います。

a)質問で提供したTEMPLATES設定を使用します

b)FORM_RENDERERを次のようにsettings.pyに設定します。

FORM_RENDERER = 'Django.forms.renderers.TemplatesSetting'

c)アプリ「Django.forms」をINSTALLED_APPSの「settings.py」リストに追加します

また、「TEMPLATES」ディレクトリを基準にしたカスタムウィジェットテンプレートの正しいパスをカスタムウィジェットの「template_name」属性に割り当ててください。

16
user3763125