Djangoテンプレートパス


87

Windows 7環境でhttp://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02のチュートリアルに従っています。私の設定ファイルは:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

チュートリアルの指示に従って、Django自体のソースコードのデフォルトのDjango adminテンプレートディレクトリ(django / contrib / admin / templates)からテンプレートをmyappディレクトリのadminサブディレクトリに取得しbase_templateましたadmin/base_site.html

何らかの理由で効果が出ないようです。問題になる可能性のある手がかりはありますか?同期データベースを実行する必要がありますか?

回答:


182

これはDjangoチュートリアルにはないこと、そして恥ずべきことですが、パス変数の相対パスを設定することをお勧めします。次のように設定できます。

import os

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = PROJECT_PATH + '/media/'

TEMPLATE_DIRS = (
    PROJECT_PATH + '/templates/',
)

この方法でDjangoプロジェクトを移動すると、パスのルートが自動的に更新されます。これは、運用サーバーをセットアップするときに役立ちます。

次に、TEMPLATE_DIRSパスに疑わしいものがあります。テンプレートディレクトリのルートを指す必要があります。また、末尾もにする必要があり/ます。

ここでは、.../admin/ディレクトリがテンプレートのルートではないと推測します。それでも絶対パスを記述したい場合は、管理テンプレートディレクトリへの参照を削除する必要があります。

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/'
)

そうは言っても、デフォルトでテンプレートローダーは、アプリディレクトリに再帰的に移動してテンプレートファイルを見つけるように設定する必要があります。

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
#     'django.template.loaders.eggs.load_template_source',
)

特に何かを上書きしたい場合を除いて、管理テンプレートをコピーする必要はありません。

syncdbをまだ実行していない場合は、実行する必要があります。また、runserverを介してdjangoをホストしている場合は、メディアファイルを静的に提供する必要があります。


1
TEMPLATE_DIRS相対パスの末尾にある「/ admin」を削除していただきありがとうございます。
shaytac

1
この提案では、テンプレートフォルダをプロジェクトフォルダ内に配置します。より適切に整理するには、代わりにアプリのフォルダー内に配置する方が理にかなっていますか?
Sahas Katta

2
これで問題が解決しました。ありがとう。しかし、デフォルトの設定ファイルには、TEMPLATE_DIRSに「相対パスではなく絶対パスを使用することを忘れないでください」というコメントがありました。そのコメントの正当性を知っている人はいますか?
bhekman 2013年

1
PROJECT_PATHは、プロジェクトフォルダーの絶対パスです。このメソッドは、実行時に絶対メディアパスを動的に設定するため、値はハードコーディングされず、プロジェクトの場所に応じて自動的に変更できます。これは古い投稿ですが、これを使用してプロジェクト内の任意のフォルダーまたはファイルの場所を定義できます。
digitaldreamer 2013年

2
os.path.joinベースディレクトリにパスを追加するためにを使用することをお勧めします。
antonagestam 2017

34

インストール済みのDjango設定を使用する場合は、組み込みの事前定義されたBASE_DIRおよびTEMPLATESを使用しないのはなぜですか?Django(v1.8)をインストールしたpipで、次のようになります。

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


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            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',
            ],
        },
    },
]

1
この«BASE_DIR + '/ templates /'、»がトリックを実行しました。また、個別のセクションよりもエレガントに見えます。
Maxiller

1
os.path.join(BASE_DIR, 'templates')プラットフォームに依存しないパスに使用します。
Abhyudai

10

プロジェクトディレクトリ(/root/templates/app_name)にテンプレートを保持するためのDjango 2.0.3のスマートソリューション:

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

views.pyでこのようなテンプレートパスを追加するだけです。

app_name/html_name

8

Django 1.6.6の場合:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

デバッグモードおよびプロダクションモードの静的およびメディア:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

urls.pyに追加する必要があります:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Django 1.8では、テンプレートのパス、バックエンド、その他のパラメータを1つの辞書(settings.py)で設定できます

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            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',
            ],
        },
    },
]

公式ドキュメント。


テンプレートのパスはタプルである必要があります:これを使用しますTEMPLATE_DIRS =(os.path.join(BASE_DIR、 'templates')、)
renderbox

6

チュートリアルのこの部分にも問題がありました(バージョン1.7のチュートリアルを使用)。

私の間違いは、「Django管理」の文字列のみを編集したことであり、マニュアルに十分な注意を払っていませんでした。

これはdjango / contrib / admin / templates / admin / base_site.htmlからの行です

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

しかし、しばらくしてイライラした後、削除する必要がある 'site_headerまたはdefault:_'ステートメントがあることが明らかになりました。したがって、ステートメントを削除した後(マニュアルの例のように、すべてが期待どおりに機能しました)。

マニュアル例:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>

2

よし😁まったく新しいプロジェクトがあるとしましょう。もしそれが見つかったら、settings.pyファイルに移動して検索すると、TEMPLATES次の行os.path.join(BASE_DIR, 'template')を貼り付けるだけ'DIRS'です。最後に、次のようなものが表示されます。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

BASE_DIRディレクトリの場所を知りたい場合は、次の3つの簡単なコマンドを入力します。

python3 manage.py shell

シェルに入ったら:

>>> from django.conf import settings
>>> settings.BASE_DIR

PS:テンプレートフォルダーに別の名前を付けた場合、ここでも変更します。



1

django 3.1で、プロジェクトの設定に移動してOSをインポートします

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',
            ],
        },
    },
]

0

基本的にBASE_DIRは、あなたのdjangoプロジェクトディレクトリmanage.pyです。

    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',
                ],
            },
        },
    ]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.