Как Django находит шаблон?

Ниже приведен мой urls.py в mysite/mysite/settings.py

urlpatterns = [
    path('', TemplateView.as_view(template_name='homepage/main.html')),
    path('admin/', admin.site.urls), # add something
    path('polls/', include('polls.urls')),
    path('hello/', include('hello.urls')),
    path('accounts/', include('django.contrib.auth.urls')),  # Add, Search how does djnago find template.
    path('autos/', include('autos.urls')),
]

Если какой-то пользователь запрашивает www.mysite.com/accounts/login

Этот запрос идет по адресу 'django.contrib.auth.urls' там запрос идет по адресу path('login/', views.LoginView.as_view(), name='login') не в django/contrib/auth/urls.py..

Но мой шаблон входа в систему находится в mysite/homepage/templates/registration/login.html. И ниже мой login.html

{% extends "base_bootstrap.html" %}

{% block content %}

{% if form.errors %}
  <p>Your username and password didn't match. Please try again.</p>
{% endif %}

<form method="post" action="{% url 'login' %}">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class="btn btn-primary" value="Login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}

Это работает хорошо. Поэтому я не знаю, как Django находит мои login.html

Как Django находит мой login.html?

Движок шаблонов Django использует Loaders для загрузки шаблона,

TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [BASE_DIR / 'templates'],
}]

Если у вас есть подобный фрагмент в файле settings.py, то шаблоны загружаются из файловой системы, в соответствии с DIRS.

Django имеет свои собственные шаблоны аутентификации, в вашем случае вы переопределяете шаблон входа по умолчанию, помещая ваш пользовательский шаблон в templates/registration/login.html

Для более подробной информации смотрите doc: loading-templates

Django имеет два основных способа, которыми он будет искать шаблоны, определяемые настройками. Я покажу пример

from pathlib import Path

BASE_DIR = Path(__file__).resolve(strict=True).parent.parent + '/'

INSTALLED_APPS = [
    'website',
    'users',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            BASE_DIR + 'templates',
            '/var/my_other_templates',
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

В данном примере, допустим, мы используем TemplateView с атрибутом template_name = 'users/login.html', или {% include "users/login.html" %} в шаблоне. В любом случае поиск будет одинаковым.

  • Первый путь лежит через список каталогов, предоставленный в DIRS, которые он будет проверять по порядку. Если он найдет файл с именем login.html в каталоге ./templates/users/login.html, он будет использовать этот шаблон и прекратит поиск. В противном случае, он будет искать /var/my_other_templates/users/login.html.
  • Если он не найдет шаблон ни в одном из этих мест, он перейдет к вашим приложениям. Сначала он будет искать в ./website/templates/users/login.html, а если не найдет, то в ./users/templates/users/login.html.
  • .

Если он не найдет шаблон ни в одном из этих мест в данном примере, он вернет ошибку TemplateNotFound, и ошибка покажет все каталоги, в которых Django искал шаблон.

Если вы используете внутренние приложения Django, он будет использовать шаблоны из этих приложений, если вы не переопределили их.

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