Какова правильная структура шаблонов 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.

Вернуться на верх