blog新米webエンジニアによる技術ブログ。Djangodjangoでテンプレートファイルを管理する時、置き場所の候補はたぶん2つ考えられます。ディレクトリの直下にtemplatesディレクトリを作るただ、どういう風に管理するのがベスト(というか一般的)なのかということについてググったけどもなかなかこれだ!というのが出てきませんでした。考えてみましたという話。ディレクトリの下にtemplatesディレクトリを作り、その下にそれぞれのアプリで必要なテンプレートを作って管理してました。テンプレートを使用するときにアプリケーション名(正しくは「アプリケーションのディレクトリ名」か)を記述する必要がありません。新しく定義するたびにそれぞれにアプリケーション名を書く必要があり、(あんまりないとはいえ)アプリケーション名を変更したい場合に影響範囲が大きいと考えたのです。上の管理方法によるデメリットただ、この管理方法には重大な欠点があります。それは、次のような場合です。いう同一ファイル名のテンプレートが定義されているとします。app2</body></html>さて、この状態でプロジェクトを実行してみます。はい、問題ないですね。app1/templatesのindex.htmlが表示されています。あれ...?app2ではなくapp1のtemplatesディレクトリの方のindex.htmlから読み込んでいるみたいですね。複数のアプリケーションで同一テンプレート名を定義すると、先に見つかった方が使用されてしまうんです。index.html等はどのアプリケーションでも一般的に使用されるテンプレート名だと思うので、この名前を異なるアプリケーション間でユニークになるようにするというのは現実的ではありません。いうわけで、アプリケーションディレクトリ直下に置いて管理するのはやめようと思いました。直下に置くように変更します。先ほどの例では、ディレクトリ構成を以下のように修正します。wsgi.pyそうすると、上で述べたように、View内でtemplate_nameを記載する時にはアプリケーション名が必要です。増えると、そのたびにtemplate_nameにアプリケーション名を書かないといけません。これをどうにかしたい。アプリケーション名は1ヶ所にまとめる「Viewごとにtemplate_nameにアプリケーション名直書き」状態を回避する方法を考えてみます。一般的には、定数としてくくりだしてしまって、template_nameでそれを利用する方法ですね。'app1'と書いてみました。self.template_name)これで、Viewのあちこちにアプリケーション名埋め込んで保守が大変、ということはなくなりました。今回の例では、APP_LABELはもちろんviews.pyの先頭で定義しちゃっても問題ないんですがその他のファイルで使う可能性を考えて__init__.pyに書いてみました。使用するせっかくなので、もう1個別の方法を考えてみます。以前、テンプレートのタグ内でアプリケーション名を取得する方法について書きました。urls.pyでapp_nameを定義しましょう。側を次のように変更します。self.template_name)これでもいいですね。あちこちにアプリケーション名を直書きするという事態は回避できています。先頭で{app_name}を置換する必要があるというあたりが両者を比較した時に感じたところです。個人的には特に最後に挙げたものが気になるかな...って感じなのでしばらくはAPP_LABELに書く方法で実装してみようかなと思いました。定義していることが前提となっています。project直下に配置する場合は同じくsettings.pyのTEMPLATE_DIRSに絶対パスで指定する必要があります。設定方法が変わっているみたいです。アプリケーションにソーシャルログイン機能を実装して、...2016-01-04[Django]URLconfのユニットテストの書き方メモ。正規表現とか使って...2015-12-30Djangoのチュートリアルが終わった後に読みたいもの自分用メモ。チュートリアルやった。Pytho...タイトルの通り。Playgroundがリリースされました月別アーカイブはてなブログをはじめよう!dackdiveさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。