Путь шаблона Django
Я следую руководству http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 в среде Windows 7. Мой файл настроек:
TEMPLATE_DIRS = (
'C:/django-project/myapp/mytemplates/admin'
)
Я получил base_template
из шаблона admin/base_site.html
из встроенного каталога шаблонов admin Django в исходном коде самого Django (django/contrib/admin/templates) в подкаталог администратора каталога myapp, как указано в руководстве,
По какой-то причине это не влияет. Есть ли какие-нибудь подсказки о том, что может быть проблемой? Должен ли я выполнять синхронизацию db?
Ответы
Ответ 1
Я знаю, что это не в учебнике 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',
)
Вам не нужно копировать шаблоны admin, если вы специально не хотите что-то переписывать.
Вам нужно будет запустить syncdb, если вы еще не запустили его. Вам также понадобится статический сервер ваших медиафайлов, если вы размещаете django через серверы.
Ответ 2
Если вы используете настройки Django, то почему бы просто не использовать его испеченные, предопределенные BASE_DIR и ШАБЛОНЫ? В пипе, установленном 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',
],
},
},
]
Ответ 3
Для Джанго 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',
],
},
},
]
Официальные документы.
Ответ 4
Умное решение в 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
Ответ 5
У меня также были проблемы с этой частью учебника (используется учебник для версии 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>
Ответ 6
Хорошо 😁 Допустим, у вас есть совершенно новый проект, если вы хотите, чтобы вы пошли в файл 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: Если бы вы назвали вашу папку с шаблоном другим именем, вы бы также изменили ее здесь.
Ответ 7
В 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,
...
},
]