2017-10-19 6 views
2

Django 1.11の組み込みウィジェットテンプレートをオーバーライドしようとしています。私はこの点に関してドキュメントが言っていることすべてをやっているようですが、ウィジェットテンプレートの場合、Djangoは私のプロジェクトを全く見ていないので、TemplateDoesNotExistエラーが出ます。Djangoウィジェットテンプレートの上書きは、プロジェクトテンプレートディレクトリ内を検索しません。直し方?

は、ここで私は、オーバーライドのために持っているものだ:

class MyFileWidget(widgets.FileInput): 
    template_name = 'myapp/my_file_widget.html' 

テンプレートは間違いなくあります。私がテンプレートをレンダリング呼び出しに渡すと、それはうまくいきます。問題は経路の問題です。ビューからレンダリングを呼び出すときは、次のことをチェックします。

projectroot /テンプレート/ myappに/ my_file_widget.html djangoroot /フォーム/テンプレート/ myappに/ my_file_widget.html

それは私のプロジェクトでテンプレートを見つけると、それをレンダリングします。上記のクラスでテンプレートパスを指定すると、これは起こりません。その場合、ファイルが実際に存在するプロジェクトテンプレートをチェックインしないで、djangoパスのチェックを開始します。したがって、エラーメッセージ。

ローダーがレンダリングコールでプロジェクトテンプレートをチェックする理由はわかりませんが、ウィジェットオーバーライドの「template_name」を探しているときは、このようにしていません。何か案は?

答えて

5

デフォルトでは、FORM_RENDERERのデフォルト設定は'django.forms.renderers.DjangoTemplates'です。

アプリのテンプレートディレクトリ(例:projectroot/myapp/templates/myapp/my_file_widget.html)を確認しますが、プロジェクトのテンプレートディレクトリを確認しません(例:projectroot/templates/myapp/my_file_widget.html)。

TEMPLATES設定と同じ設定を使用する場合は、レンダラーTemplatesSettingを使用する必要があります。

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' 

また、Djangoはまだウィジェットテンプレートで構築を使用できるように、あなたのTEMPLATES設定を更新する必要があります。これを行う最も簡単な方法は、django.formsINSTALLED_APPSに追加することです。これについての詳細は、the docsを参照してください。

+0

回答を投稿しよう!それはそれを行います。参考までにDjangoTemplatesが自分のプロジェクトテンプレートをチェックしているのを見たことがありませんでした。代わりに、ちょうどDjangoのテンプレートを見ているようだ、そのビットが正しいことを知らない。別の解決策は、フォームごとに「default_renderer」を割り当てることですが、もちろんFORM_RENDERERを変更する方が優先されます。 – meesterguyperson

+1

私が言ったように、 'DjangoTemplates'はプロジェクトテンプレートを設計どおりにチェックしません。 'django.contrib'アプリ、サードパーティ、プロジェクトの一部であるかどうかにかかわらず、' INSTALLED_APPS'にあるすべてのアプリのテンプレートディレクトリをチェックする必要があります。 'projectroot/templates/myapp/my_file_widget.html'にテンプレートを保存している場合、' myapp'には 'projectroot/myapp/templates /'というテンプレートディレクトリがありません。 – Alasdair

+0

ああ、つまらない。私は誤解していると思う。その後、よく見える。グラシアス! – meesterguyperson

関連する問題