Django 5 для начинающих

Прогресс по курсу:  9/1004

5.6 Создание шаблонов представлений
2 из 5 шагов пройдено
0 из 9 баллов  получено

Создание шаблонов представлений

Вы создали представления и шаблоны URL-адресов для приложения blog.

Шаблоны URL-адресов соотносят URL-адреса с представлениями, а те, в свою очередь, решают, какие данные будут возвращаться пользователю.

Шаблоны определяют способ отображения данных; обычно они пишутся на HTML в сочетании с языком шаблонов Django.

Более подробная информация о языке шаблонов Django находится на странице https://docs.djangoproject.com/en/5.0/ref/templates/language/.

Давайте добавим в приложение шаблоны, чтобы отображать посты в удобном для пользователя виде.
Внутри каталога нашего проекта создайте следующие ниже каталоги и файлы:

Приведенная выше структура будет файловой структурой ваших шаблонов.

Файл base.html будет включать в себя главную HTML-структуру веб-сайта и разделит контент на главную область содержимого и боковую панель.

Файлы list.html и detail.html будут наследовать от файла base.html, чтобы прорисовывать представления соответственно списка постов блога и детальной информации о посте.

Так-же необходимо прописать расположение каталога шаблонов в файле настроек settings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'], # указываем путь к каталогу с шаблонами
        # ...
    },
]


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

Он основан на шаблонных тегах, шаблонных переменных и шаблонных фильтрах:

  • шаблонные теги управляют прорисовкой шаблона и выглядят как {% tag %};

  • шаблонные переменные заменяются значениями при прорисовке шаблона и выглядят как {{ variable }};

  • шаблонные фильтры позволяют видоизменять отображаемые переменные и выглядят как {{ variable|filter }}.

Все встроенные шаблонные теги и фильтры можно посмотреть на странице https://docs.djangoproject.com/en/5.0/ref/templates/builtins/.

 

Создание базового шаблона

Отредактируйте файл base.html, добавив в него следующий ниже исходный код:

{% load static %}
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    <link href="{% static 'css/blog.css' %}" rel="stylesheet">
</head>
<body>
<div id="content">
    {% block content %}
    {% endblock %}
</div>
<div id="sidebar">
    <h2>My blog</h2>
    <p>This is my blog.</p>
</div>
</body>
</html>

Тег {% load static %} сообщает Django, что нужно загрузить статические шаблонные теги static, предоставляемые приложением django.contrib.staticfiles, которое содержится в настроечном параметре INSTALLED_APPS.

После их загрузки шаблонный тег {% static %} можно использовать во всем этом шаблоне.

С помощью указанного шаблонного тега можно вставлять статические файлы, такие как файл blog.css

STATIC_URL = 'static/'

Так как по умолчанию переменная STATIC_URL имеет значение static/, а это значит, что нам достаточно создать в папке приложения blog каталог с именем static и добавить в него необходимые нам статические файлы. Но, естественно, при необходимости через данную настройку мы можем изменить расположение каталога статических файлов. Если нас не устраивает хранение файлов в каталоге по умолчанию - каталоге static приложения, либо мы хотим указать несколько папок, то мы можем в файле settings.py задать все необходимые каталоги с помощью переменной STATICFILES_DIRS

Создайте данные папки и добавьте в файл. Общий путь должен быть mysite/blog/static/css/blog.css:

body {
    margin: 0;
    padding: 0;
    font-family: helvetica, sans-serif;
}

a {
    color: #00abff;
    text-decoration: none;
}

h1 {
    font-weight: normal;
    border-bottom: 1px solid #bbb;
    padding: 0 0 10px 0;
}

h2 {
    font-weight: normal;
    margin: 30px 0 0;
}

#content {
    float: left;
    width: 60%;
    padding: 0 0 0 30px;
}

#sidebar {
    float: right;
    width: 30%;
    padding: 10px;
    background: #efefef;
    height: 100%;
}

p.date {
    color: #ccc;
    font-family: georgia, serif;
    font-size: 12px;
    font-style: italic;
}

/* pagination */
.pagination {
    margin: 40px 0;
    font-weight: bold;
}

/* forms */


input[type=submit] {
    font-weight: bold;
    background: #00abff;
    color: #fff;
    padding: 10px 20px;
    font-size: 14px;
    text-transform: uppercase;
}

.errorlist {
    color: #cc0033;
    float: left;
    clear: both;
    padding-left: 10px;
}

/* comments */
.comment {
    padding: 10px;
}

.comment:nth-child(even) {
    background: #efefef;
}

.comment .info {
    font-weight: bold;
    font-size: 12px;
    color: #666;
}

Вы видите, что в базовом шаблоне присутствуют два тега {% block %}. Они сообщают Django, что нужно определить блок в отмеченной области. Шаблоны, которые наследуют от этого шаблона, могут заполнять блоки контентом.

В приведенном выше исходном коде был определен блок под названием title и блок под названием content.


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Комментарий закреплён

Понравилась задача, тест или урок? Поставьте лайк, поддержите курс. Ваша поддержка очень важна для нас.

Илья, думаю будет верно немного изменить ковычки в данной записи, IDE не может понять.

<link href="{% static "css/blog.css" %}" rel="stylesheet" 

на <link href="{% static 'css/blog.css' %}" rel="stylesheet">

@Dmitrii_Novozhilov, Илья пока занят, исправлю я, спасибо.

Уточните, пожалуйста:
1) Правильно ли понимаю, что общая рекомендация HTML советует использовать 2 пробела в кач-ве отступа?
Или это можно проигнорировать?

2) Как указывать в языке шаблонов Django блоки правильно, а конкретно в {% endblock %} стоит ли указывать название блока которое было например в {% block content %}, работает оно и так и так, но что будет являться лучшей практикой? Возможно стоит всегда указывать в {% endblock content %} наименование блока?

@Нарбеков_Марсель

1. да, но на вид страницы она не влияет.

2. не обязательно, но это улучшает читаемость кода.

Как купить лицензию на pycharm? Если мне ее купят друзья из Австрии, она будет работать в России? Мой account в JetBrains привязан к российской почте. 

@Ольга_Миронова, Вот это точно не подскажу, скорее всего будет работать. Я использую лицензию, купленную на компанию, поэтому детально не знаю всех нюансов сейчас.

@Илья_Перминов, Спасибо! Пойду путем экспериментов - сначала попробую на месяц.

Смотрите вы тут упустили очень важный момент и люди просто не поймут почему так работает!

 

обычно указывается в файле настроек проекта такая настройка 

 

STATICFILES_DIRS = [

        os.path.join(BASE_DIR, 'your_app/static'),

]

 

чтобы джанго понимал где искать статику, но у вас же путь указан mysite/blog/static/css/blog.css, так можно и нужно делать но вы не обьяснили просто что когда мы указываем в INSTALLED_APPS наше приложение 

 

INSTALLED_APPS = [

 

...

 

'blog',

 

...

 

]

 

в нашем случаем мы указали его так вот: blog.apps.BlogConfig в целом это не имеет разницы то найтройка которая стоит в джанго по умолчанию вот она, она так же ищет статику в приложениях нашего приложения по этому в html мы указываем путь css/blog.css 

 

STATIC_URL = 'static/'



думаю это нужно было учесть!

если я где то не прав подправьте меня!

@No_Name, Добавили в лекцию.

Здравствуйте, хотел бы уточнить, почему мы создаем static папку внутри приложения blog когда templates мы создаем уже в корне проекта?

@Vlad_Kirnats, В документации Django написано хранить статические файлы в папке приложения (blog/static/), но при этом четко написано, что можно хранить статику "где угодно". В мелких проектах можно хранить внутри приложения, в крупных проектах удобнее в корне проекта. Тут самый главный фактор, это как будет удобнее это обслуживать, если в мелком проекте 1 файл стилей, то это одно, а если там css, js, и куча всяких изображений, то это уже другое. У нас у блога как раз всего один файл стилей и все.

А шаблоны это уже другое, их почти всегда много. И их лучше всего хранить в корне проекта, разделяя внутри приложения по папкам.

Не подскажите, почему выделяется строка Doctype? Так то я понимаю, что из-за {% load static %}. Вопрос в том где я пропустил настройки, решающие жту проблему

@Maxim_Lapshin, это вероятно из-за использования PyCharm Community Edition, можно не обращать внимания.

Спасибо за ответ🤝

@Maxim_Lapshin, вообще load static можно писать не первой строчкой, а второй или третьей, или вообще какой угодно, главное, чтобы это было указано до непосредственного использования статических файлов
Ты можешь doctype html и load static местами поменять и всё будет ок в общем-то)

Вот способ избавится от ошибки Unexpected Token, заменяем строку:

<!DOCTYPE html>

на:

{{ '<' }}{{ '!DOCTYPE html>' }}

 

Просичтался. Но где?
Статика не подключается, не знаю где я накосячил

Изменен Ravshan Battalov

@Ravshan_Battalov, директория статики должна быть в директории приложения blog:

Общий путь должен быть mysite/blog/static/css/blog.css: