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
パスはどこから来たの?ありがとう。
それは確かにバグではありません
この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
のような同じ用語でパスを指定する必要があります。
プロジェクトの「TEMPLATES」ディレクトリの下に保存されているカスタムウィジェットテンプレートを使用する場合は、次の手順に従います。
a)質問で提供したTEMPLATES
設定を使用します
b)FORM_RENDERER
を次のようにsettings.py
に設定します。
FORM_RENDERER = 'Django.forms.renderers.TemplatesSetting'
c)アプリ「Django.forms
」をINSTALLED_APPS
の「settings.py
」リストに追加します
また、「TEMPLATES
」ディレクトリを基準にしたカスタムウィジェットテンプレートの正しいパスをカスタムウィジェットの「template_name
」属性に割り当ててください。