Какова правильная структура шаблонов Django?
У меня есть проект на Django под названием: "my_site", а приложение называется "blog", я пытаюсь вывести "index.html" по пути: my_site/blog/templates/blog/index.html. Но продолжаю получать эту ошибку:
Template-loader postmortem
Django tried loadi
ng these templates, in this order:
Using engine django:
django.template.loaders.filesystem.Loader: C:\Users\Ricardo Neto\Dev\Django_Projects\my_site\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Python310\lib\site-packages\django\contrib\admin\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Python310\lib\site-packages\django\contrib\auth\templates\index.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Users\Ricardo Neto\Dev\Django_Projects\my_site\blog\templates\index.html (Source does not exist)
Вид:
def index(request):
return render(request, 'index.html')
урлы.py:
urlpatterns = [
path('', views.index),
path('posts', views.show_all_posts),
path('posts/<slug:slug>', views.show_post)
]
Если я перемещаю index.html за пределы папки блога, как в этом примере: my_site/blog/templates/index.html, код запускается и index.html отображается без проблем, но меня учили, что правильной структурой является создание папки внутри templates с тем же именем приложения. Не мог бы кто-нибудь объяснить мне, как я должен структурировать свои файлы?
Django разрешает шаблоны относительно каталога "templates", расположенного внутри каталога приложений, и выбирает первый шаблон из всех приложений, чье имя совпадает. Например, если у вас есть два приложения: blog и news оба с шаблонами с именем "index.html" в директории "templates", Django не сможет правильно выбрать одно из них. Чтобы сделать различие, вы можете создать подпапку внутри каталога "templates" с именем соответствующего приложения: "blog/templates/blog/index.html" и "news/templates/news/index.html". После этого вы можете использовать эти шаблоны в функциях представления следующим образом: render(request, 'news/index.html') и render(request, 'blog/index.html').
Вы можете прочитать об этой теме здесь, обратите внимание на замечание "Template namespacing": https://docs.djangoproject.com/en/4.0/intro/tutorial03/
вместо того, чтобы хранить его внутри приложения. Я предпочитаю хранить его в файле проекта. my_site/templates/app_x/index.html
├───accounts
│
├───django_project
│
└───templates
├───accounts
└───registration
В файле settings.py
обновите DIRS
на путь к папке шаблонов. Как правило, папка templates создается и хранится в каталоге с образцами, где manage.py
.
import 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',
],
},
},
]
Если я открываю отдельные файлы под templates
, я отображаю их как folder_name/index.html
, в противном случае непосредственно как index.html
.