テンプレートをdjangoプロジェクトに配置するのに最適な場所はどこですか?


88

テンプレートをdjangoプロジェクトに配置するのに最適な場所はどこですか?

回答:


50

Djangoブックの第4章から:

テンプレートを置く明確な場所がわからない場合は、Djangoプロジェクト内(つまり、例に従っている場合は、第2章で作成したmysiteディレクトリ内)にテンプレートディレクトリを作成することをお勧めします。

これはまさに私が行うことであり、私にとってはとてもうまくいきました。

私のディレクトリ構造は次のようになります:

/mediaすべてのCSS / JS /画像など、メインプロジェクトコード(つまり、Pythonコード)の
/templatesテンプレート
/projectname


1
テンプレートを/ templatesに置くとき、django.template.loaders.filesystem.LoaderでロードするTEMPLATE_DIRSの/ templateへのフルパスを指定せずにテンプレートローダーにロードするように指示する方法はありますか?相対パスでこれを行うために素晴らしいことだ、と1.4の下で私のローダが<プロジェクト> /テンプレートの下に見ていない
チロSantilli郝海东冠状病六四事件法轮功

87

<PROJECT>/<APP>/templates/<APP>/template.htmlアプリ固有のテンプレート用に配置され、他の場所でアプリを再利用できるようにします。

一般的な「グローバル」テンプレートについては、それらを <PROJECT>/templates/template.html


11
2 <APP>秒の理由を知り<PROJECT>/<APP>/templates/<APP>/template.htmlたいですか?
David Xia

18
最初の/ app / templatesは、関連するアプリでテンプレートをグループ化することです。2番目のアプリは、名前の衝突を防ぐことです。(おそらく、TEMPLATE_DIRSがこれらの各ディレクトリを指すように指定しますが、最後に、Djangoはそれらを1つの巨大なディレクトリにまとめます。)参照:docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista

3
仕事(ジャンゴ1.6)このために、私は、ファイルシステムのテンプレートローダのためのディレクティブを追加する必要がありました:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman

3
この答えは古いですが、どういうわけか私はここに行き着きました。記録のために、TEMPLATE_DIRS現在は非推奨されて-あなたの代わりに追加してくださいDIRS=[os.path.join(BASE_DIR, "templates")]TEMPLATES見る- stackoverflow.com/questions/29725132/...を
ジョン・アーロン

9

ドミニクとdlrustからのフォローアップ、

setuptoolsソースディストリビューション(sdist)を使用して、djangoプロジェクトとアプリをパッケージ化し、さまざまな環境にデプロイします。

テンプレートと静的ファイルは、setuptoolsでパッケージ化できるように、djangoアプリケーションディレクトリの下にある必要があることがわかりました。

たとえば、テンプレートと静的パスは次のようになります。

PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js

これを機能させるには、MANIFEST.inを変更する必要があります(http://docs.python.org/distutils/sourcedist.html#the-manifest-in-templateを参照)

MANIFEST.inの例:

include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg

また、django設定ファイルでapp_directoriesローダーがTEMPLATE_LOADERSにあることを確認する必要があります。django 1.4にはデフォルトで存在すると思います。

django設定テンプレートローダーの例:

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

rsyncファイルを単に処理するのではなく、なぜsdistsを使用するのか疑問に思っている場合に備えて。これは、構成管理ワークフローの一部であり、PIPを変更せずにテスト、受け入れ、および運用環境に展開される単一のビルドtarballがあります。


1
+1追加の詳細とサンプル行を提供していただきありがとうございます。
gotgenes 2012年

/static/テンプレートとモジュール式アプリについて考えるとき、+ 1をレイアウト計画に含める。別のベストプラクティスとして、cssファイルをstatic/app/css同様にjs、たぶん、jpgまたは単にと呼ばれるフォルダに配置することもできます/static/app/images
ホブ、2013

7

DJANGO 1.11

manage.pyが存在するテンプレートフォルダを追加します。これはベースディレクトリです。TEMPLATESのDIRSを、settings.pyで次のように変更します。

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},

]

コードを使用してテンプレートを使用するには、

def home(request):
    return render(request,"index.html",{})

views.py。これはdjango 1.11では完全に機能します


1

これは、プロジェクトレベルではより個人的な選択です。プラグ可能である必要があるアプリについて話している場合、アプリのテンプレートディレクトリは、アプリがデフォルトになる場所です。しかし、プロジェクト全体では、それがあなたにとって最も効果的です。


1

TEMPLATE_DIRS絶対パスが必要だと理解しました。また、コード内の絶対パスは好きではありません。だから、これは私にとってうまくいきますsettings.py

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)

1
Djangoのプロジェクトは、そのベースパスとして標準settings.pyですでに定義されているBASE_DIR:あなたはこれを簡略化することができますので、os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue

1

Django 1.10

TEMPLATE_DIRS 廃止予定です。

次にTEMPLATE、を使用する必要があります。Django1.8で次のように導入します。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

TEMPLATESを定義したら、ALLOWED_INCLUDE_ROOTS、TEMPLATE_CONTEXT_PROCESSORS、TEMPLATE_DEBUG、TEMPLATE_DIRS、TEMPLATE_LOADERS、およびTEMPLATE_STRING_IF_INVALIDを安全に削除できます。

最適な場所について、Djangoは次のようなテンプレートを探しています。

  • DIRSは、エンジンがテンプレートソースファイルを検索順に検索するディレクトリのリストを定義します。
  • APP_DIRSは、エンジンがインストールされたアプリケーション内のテンプレートを探す必要があるかどうかを示します。各バックエンドは、テンプレートが格納されるアプリケーション内のサブディレクトリの従来の名前を定義します。

詳細:https : //docs.djangoproject.com/en/1.10/topics/templates/#configuration


0

以前の解決策は私の場合うまくいきませんでした。私が使用した:

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]

私の答えを見てください。TEMPLATE_DIRSは非推奨になりました。
ウィルフリード

Djangoのプロジェクトは、そのベースパスとして標準settings.pyですでに定義されているBASE_DIR:あなたはこれを簡略化することができますので、os.path.join(BASE_DIR, '../myapp/templates')
ngoue

0

django-dbtemplatesを使用して、データベースにテンプレートを含めることも検討できます。また、キャッシング用のセットアップと、古いバージョンのテンプレートを保持しておくためのdjango-reversionアプリケーションも用意されています。

それは非常にうまく機能しますが、私はファイルシステム側へのインポート/ファイルシステム側からの同期にもう少し柔軟性があることを望みます。

[編集:2018年8月20日-このリポジトリは利用できません。同じ名前のリポジトリはhttps://github.com/jazzband/django-dbtemplatesで利用でき、8か月前に更新されました。私はもはやDjangoを意味のある方法で使用していないので、これを保証することはできません。]


これはいつ良いアイデアでしょうか?DBからテンプレートをロードするのが遅くなりませんか?
jguffey 2014年

テンプレートをdbに保存すると、dbに依存するようになることはありません。加えて、dbをgit commitの一部にしますか?テンプレートで異なるユーザーが行った変更をどのように調整しますか?
gautamaggarwal

これは私がgitに気づく前に書かれたものです。当時私がsvnを使用していたかどうかさえわかりません。今バージョン管理システムを使用することをお勧めします。
TonyM 2018

@tonemcd、このリポジトリは削除されました。
lmiguelvargasf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.