Как 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, он будет использовать шаблоны из этих приложений, если вы не переопределили их.