Я знаю, что этого нет в учебнике 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',
]
Вам не нужно копировать шаблоны администратора, если вы специально не хотите что-то перезаписывать.
Вам нужно будет запустить syncdb, если вы еще не запустили его. Вам также потребуется статический сервер ваших медиа-файлов, если вы размещаете django через runserver.
os.path.join
для добавления путей к базовому каталогу.Если используются установленные настройки 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', ], }, }, ]
источник
os.path.join(BASE_DIR, 'templates')
чтобы путь не зависел от платформы.Умное решение в 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 просто добавьте такой путь к шаблону:
источник
Для 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', ], }, }, ]
Официальные документы.
источник
У меня также были проблемы с этой частью учебника (использовался учебник для версии 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>
источник
Хорошо 😁 Допустим, у вас есть совершенно новый проект, если вы хотите пойти в
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 простые команды:
Как только вы окажетесь в оболочке:
>>> from django.conf import settings >>> settings.BASE_DIR
PS: Если вы назвали папку своего шаблона другим именем, вы также измените его здесь.
источник
В 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', ], }, }, ]
источник
В 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, ... }, ]
источник
В отличие от некоторых ответов, опубликованных в этой теме, добавление не
'DIRS': ['templates']
имеет никакого эффекта (оно избыточно), посколькуtemplates
это путь по умолчанию, по которому Django ищет шаблоны.Если вы пытаетесь сослаться на шаблон приложения, убедитесь, что ваше приложение находится в списке
INSTALLED_APPS
в основном проектеsettings.py
.INSTALLED_APPS': [ # ... 'my_app', ]
Цитирование Джанго Шаблоны документов:
Когда вы создаете приложение для своего проекта,
templates
внутри каталога приложения нет каталога. Поскольку у вас может быть приложение без использования шаблонов, Django не создает такой каталог. То есть вы должны создать его и хранить там свои шаблоны.Вот еще один абзац из документации Django Tutorial , который еще яснее:
источник
templates
каталоге.в основном
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', ], }, }, ]
источник