Заполнение слота шаблона, содержимое не отображается
В моей папке Templates я создал 2 html файла:
- main.html
- user.html
Структура файла main.html такова:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DJANGO</title>
</head>
<body>
{% block userinfo %}
{% endblock userinfo %}
</body>
</html>
Структура файла user.html такова:
{% extends "main.html" %}
{% block userinfo %}
<h2>John Doe</h2>
<p>Explorer of life.</p>
{% endblock userinfo %}
Я не понимаю почему
<h2>John Doe</h2>
<p>Explorer of life.</p>
не появляется в браузере, когда я вызываю main.html
Я тоже пробовал писать таким образом
{% extends "main.html" %}
{% block userinfo %}
<h2>John Doe</h2>
<p>Explorer of life.</p>
{% endblock %}
без пользователя в конечном блоке, но это не работает.
В файле settings.py в списке Templates и списке DIR я добавил:
os.path.join(BASE_DIR,'templates'),
и я импортировал os тоже.
В файле views.py, который я создал, я написал
from django.shortcuts import render
from django.http import HttpResponse
def main(request):
return render(request,'main.html')
В файле urls.py, который я создал, я написал
from django.urls import path
from . import views
urlpatterns = [
path('main/',views.main,name='')
]
Когда я вызываю страницу с помощью http://localhost:8000/main/. у меня нет никакой ошибки. Единственная проблема в том, что страница пустая. И если я пытаюсь добавить текст в main.html, он появляется на экране, но содержимое из user.html не появляется.
Может ли кто-нибудь мне помочь?
Когда вы рендерите main.html
напрямую, ваш user.html
будет проигнорирован.
Если вы выводите user.html
из django, вы получите ожидаемый результат.
Для инъекции содержимого user.html
в main.html
нужно использовать что-то вроде {% include "user.html" %}
вместо оператора block
s.
Расширение в шаблонах следует той же логике, что и наследование классов, оно идет по пути вниз, а не вверх.
Как уже было сказано, main - это базовый шаблон, и вы никогда не увидите содержимое шаблонов, которые вы расширяете, наоборот, вы увидите содержимое базового шаблона (того, для которого вы расширяете) в дочернем шаблоне (том, который расширяется).
Полагаю, что поведение, которого вы ожидаете, это то, которое дает тег include
main.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DJANGO</title>
</head>
<body>
{% include "user.html" %}
</body>
</html>
user.html
<h2>John Doe</h2>
<p>Explorer of life.</p>