Найти в Дзене
And.Action

Начал изчать Django FrameWork ч.9 Шаблоны.

Доброго времени суток. Вся суть расширения шаблона состоит в том, чтобы избавить себя от лишних трудов оформления каждой страницы. Грубо говоря, не делать одно и то же на каждой странице. Например у нас есть шапка, которая на каждой странице странице нашего приложения будет одна и та же. Тогда почему бы не вынести её в отдельный базовый файл и просто не ссылаться на него каждый раз, чем копировать код этой шапки от файла к файлу. Создадим базовый файл с содержимым практически таким же как и у post_list.html:
blog/templates/blog/base.html <!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"
integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+Nc

Доброго времени суток. Вся суть расширения шаблона состоит в том, чтобы избавить себя от лишних трудов оформления каждой страницы. Грубо говоря, не делать одно и то же на каждой странице. Например у нас есть шапка, которая на каждой странице странице нашего приложения будет одна и та же. Тогда почему бы не вынести её в отдельный базовый файл и просто не ссылаться на него каждый раз, чем копировать код этой шапки от файла к файлу.

Создадим базовый файл с содержимым практически таким же как и у post_list.html:
blog/templates/blog/base.html

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"
integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<title>
{% block title %}
{% endblock %}
</title>
</head>
<body>
<div class="header">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav offset-md-2">
<li class="nav-item active">
<a class="nav-link" href="#">
{% block header %}
{% endblock %}
</a>
</li>
</ul>
</div>
</nav>
</div>

{% block content %}
{% endblock %}

</body>
</html>

Обратите внимание, в базовый шаблон я вынес всё, кроме блоков title, header, content.
Теги
{% block title %} {% endblock %} - это открывающийся и закрывающийся теги, в которые мы будем передавать данные на конкретных страницах. Дальше будет понятнее.

Открываем файл: blog/templates/blog/post_list.html
Удаляем от туда всё содержимое и пишем:

{% extends 'blog/base.html' %}

Далее вставляем те блоки, которые необходимы для заполнения

{% block title %}
{% endblock %}

{% block header %}
{% endblock %}
{% block content %}
{% endblock %}

Заполняем их так как считаем необходимым и посмотрите что получится, а в блок content вставляем наш цикл:

{% for post in posts %}
<div class="main_body mt-5">
<div class="row">
<div class="col-8 offset-md-2">
<div class="card">
<div class="card-header">
{{ post.published }}
</div>
<div class="card-body">
<h5 class="card-title">
{{ post.title }}
</h5>
<p class="card-text">{{ post.text|truncatewords:15 }}</p>
<a href="" class="btn btn-primary">Read</a>
</div>
</div>
</div>
</div>
</div>
{% endfor %}

Если сделали всё правильно, то при запуске сервера, у вас ничего не поменяется, вы также увидите список постов.