Какой путь использует Django для поиска и загрузки шаблонов?

Я следую этому руководству в среде Windows 7. .

В моем файле настроек есть такое определение:

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

Я получил base_template из шаблона admin/base_site.html из каталога шаблонов администратора Django по умолчанию в исходном коде самого Django (django / contrib / admin / templates) в подкаталог admin каталога myapp, как указано в руководстве, но это не похоже действовать по какой-то причине.

Есть какие-нибудь подсказки, в чем может быть проблема?


person shaytac    schedule 14.06.2010    source источник


Ответы (11)


Я знаю, что этого нет в учебнике Django, и стыдно за них, но лучше настроить относительные пути для переменных пути. Вы можете настроить это так:

import os.path

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

...

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

TEMPLATE_DIRS = [
    os.path.join(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, если вы еще не запустили его. Вам также потребуется статический сервер ваших медиафайлов, если вы размещаете django через runserver.

person digitaldreamer    schedule 14.06.2010
comment
спасибо, что удалил / admin в конце относительного пути TEMPLATE_DIRS. - person shaytac; 14.06.2010
comment
Это предложение помещает каталог шаблонов в папку проекта. Для лучшей организации имеет ли смысл вместо этого поместить его в папку приложения? - person Sahas Katta; 02.06.2012
comment
Спасибо! PROJECT_PATH - такая умная идея - person Timur; 15.03.2013
comment
Это устранило мою проблему. Спасибо. НО, в файле настроек по умолчанию был комментарий с TEMPLATE_DIRS, в котором говорилось: Не забывайте использовать абсолютные пути, а не относительные пути. Кто-нибудь знает обоснование этого комментария? - person bhekman; 19.03.2013
comment
PROJECT_PATH - это абсолютный путь к папке проекта. Этот метод устанавливает абсолютный путь к мультимедиа динамически во время выполнения, поэтому значение не жестко запрограммировано и может автоматически изменяться в зависимости от местоположения проекта. Это старый пост, но вы можете использовать его для определения местоположения любой папки или файла в проекте. - person digitaldreamer; 20.03.2013
comment
В типичном проекте папка шаблонов является партнером для папки проекта (вместе со всеми приложениями). В этом случае измените значение на TEMPLATE_DIRS = os.path.realpath(PROJECT_DIR + '../templages'). - person Uri; 10.04.2013
comment
Я бы предложил использовать os.path.join для добавления путей к базовому каталогу. - person antonagestam; 30.12.2017

Если вы используете установленные настройки Django, то почему бы просто не использовать его встроенные, предопределенные BASE_DIR и TEMPLATES? В пакете установленного Django (v1.8) я получаю:

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',
            ],
        },
    },
]
person NathanQ    schedule 26.10.2015
comment
этот «BASE_DIR + '/ templates /',» сделал свое дело. И это выглядит намного изящнее, чем отдельный раздел. - person Maxiller; 23.06.2019
comment
используйте os.path.join(BASE_DIR, 'templates'), чтобы путь не зависел от платформы. - person Abhyudai; 16.03.2020

Умное решение в Django 2.0.3 для хранения шаблонов в каталоге проекта (/root/templates/app_name):

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
person 2RMalinowski    schedule 15.03.2018

Для 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 вы можете задавать пути к шаблонам, бэкэнд и другие параметры для шаблонов в одном словаре (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',
            ],
        },
    },
]

Официальные документы.

person Dunaevsky Maxim    schedule 21.08.2014
comment
Путь к шаблону должен быть кортежем: используйте этот TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'templates'),) - person renderbox; 17.03.2015

У меня также были проблемы с этой частью учебника (использовался учебник для версии 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>
person jpoppe    schedule 14.11.2014

Хорошо ???? Допустим, у вас есть совершенно новый проект. Если да, то вы должны пойти в 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: Если вы назвали папку своего шаблона другим именем, вы также измените его здесь.

person Community    schedule 11.05.2019

В 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',
            ],
        },
    },
]
person Prabesh    schedule 25.08.2020

В отличие от некоторых ответов, опубликованных в этой теме, добавление 'DIRS': ['templates'] не имеет никакого эффекта (это избыточно), поскольку templates - это путь по умолчанию, по которому Django ищет шаблоны.

Если вы пытаетесь сослаться на шаблон приложения, убедитесь, что ваше приложение находится в списке INSTALLED_APPS в основном проекте settings.py.

INSTALLED_APPS': [
   # ...
   'my_app',
]

Цитата из шаблонов документации Django:

класс DjangoTemplates¶

Установите BACKEND на 'django.template.backends.django.DjangoTemplates', чтобы настроить механизм шаблонов Django.

Когда APP_DIRS имеет значение True, механизмы DjangoTemplates ищут шаблоны в подкаталоге templates установленных приложений. Это общее имя было сохранено для обратной совместимости.

Когда вы создаете приложение для своего проекта, внутри каталога приложения нет каталога templates. Администратор Django по умолчанию не создает каталог за вас.

Ниже еще один абзац из документации Django Tutorial, который еще более ясен:

Параметр TEMPLATES вашего проекта описывает, как Django будет загружать и отображать шаблоны. Файл настроек по умолчанию настраивает серверную часть DjangoTemplates, для которой для параметра APP_DIRS установлено значение True. По соглашению DjangoTemplates ищет подкаталог шаблонов в каждом из INSTALLED_APPS.

person peterchaula    schedule 08.11.2020
comment
Хорошо сказано. Стоит упомянуть документацию по шаблонам и то, что в ней говорится о каталоге templates. - person ivanleoncz; 13.12.2020

В django 2.2 это объясняется здесь

https://docs.djangoproject.com/en/2.2/howto/overriding-templates/

import os

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

INSTALLED_APPS = [
    ...,
    'blog',
    ...,
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]
person soda    schedule 21.07.2019

в основном 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',
                ],
            },
        },
    ]

person dave    schedule 29.06.2020

Вы можете легко добавить папку шаблона в папку settings.py, os.path устарел в django 3.1, поэтому вы можете использовать путь вместо os.path. Вам просто нужно импортировать путь в settings.py, вы должны указать базовый каталог, затем вы должны указать путь к шаблону и, наконец, что не менее важно, вы должны добавить путь к папке шаблона в TEMPLATES = [{}], для пример:

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

TEMPLATE_DIR = Path(BASE_DIR, 'templates') (you can name TEMPLATE_DIR to any name)

TEMPLATES = [
{

    'BACKEND': 'django.template.backends.django.DjangoTemplates',

    'DIRS': [TEMPLATE_DIR],

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

        ],
    },
},

]

person Masum Bin Shaukat    schedule 29.05.2021