Заполнение слота шаблона, содержимое не отображается

В моей папке 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" %} вместо оператора blocks.

Расширение в шаблонах следует той же логике, что и наследование классов, оно идет по пути вниз, а не вверх.

Как уже было сказано, 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>
Вернуться на верх