JavaRush /Курси /Модуль 3: Django /Основні теги та фільтри Django Template Language (DTL)

Основні теги та фільтри Django Template Language (DTL)

Модуль 3: Django
Рівень 5 , Лекція 3
Відкрита

У цій лекції ми поговоримо про один із найпрактичніших і найпотужніших інструментів Django Template Language — теги та фільтри. З їхньою допомогою ви зможете не просто відображати дані, але й перетворювати їх так, як потрібно вашим користувачам. Готові? Поринаємо глибше в DTL!

Що таке теги та фільтри в DTL?

Теги в Django Template Language — це команди, які виконують певні дії всередині шаблону. Уявіть їх як маленьких помічників, які вирішують задачки на льоту. Наприклад, вам потрібно відобразити список об'єктів, але тільки ті, у яких певне значення фільтра. Або налаштувати логіку відображення HTML-коду — тут вам допоможуть теги.

Їх синтаксис полягає у використанні фігурних дужок із відсотками:

{% назва_тега аргументи %}

Фільтри — це «фабрика перетворень»

Фільтри — це способи зміни даних перед їх відображенням. Якщо ви хочете зменшити довжину рядка, форматувати дату або обрізати текст — це робота для фільтрів. Вони застосовуються до змінної через вертикальну риску:

{{ змінна|фільтр }}

Теги в DTL

{% for %}: цикли — основа повторень

Якщо у вас є список даних, і ви хочете пройтися по ньому та відобразити кожен елемент, то ваш найкращий друг — це {% for %}.

Приклад:

<ul>
    {% for item in items %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>

Це створить HTML-список, у якому кожен <li> міститиме один елемент із items.

Але і це ще не все. Ви можете використовувати вбудовані змінні всередині циклу, наприклад:

{% for item in items %}
    {{ forloop.counter }}: {{ item }}
{% endfor %}
  • forloop.counter — поточний номер ітерації (починається з 1).
  • forloop.counter0 — те саме, але з 0.
  • forloop.firstTrue для першого елемента.
  • forloop.lastTrue для останнього елемента.

{% if %}: умови в шаблонах

А ось і наш улюблений умовний оператор. З ним ви можете керувати відображенням даних.

Приклад:

{% if user.is_authenticated %}
    <p>Привіт, {{ user.username }}!</p>
{% else %}
    <p>Ви не авторизовані. Будь ласка, увійдіть у систему.</p>
{% endif %}

Ви також можете комбінувати умови:

{% if items|length > 5 %}
    <p>Довгий список!</p>
{% elif items|length == 0 %}
    <p>Список порожній.</p>
{% else %}
    <p>Звичайний список.</p>
{% endif %}
Зверніть увагу на фільтр |length, який повертає довжину списку.

{% block %} і {% extends %}: основи наслідування шаблонів

Ці теги допоможуть вам будувати ієрархію шаблонів і перевикористовувати код.

  • {% block %} використовується для визначення «блоків», які можуть бути перевизначені в дочірніх шаблонах.
  • {% extends %} дозволяє наслідувати інший шаблон.

Приклад:

<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}Базовий заголовок{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>>
<!-- child.html -->
{% extends "base.html" %}

{% block title %}Сторінка користувача{% endblock %}

{% block content %}
    <p>Ласкаво просимо на сторінку користувача!</p>
{% endblock %}

{% include %}: вставка інших шаблонів

Цей тег дозволяє підключити інший шаблон всередині поточного. Це зручно для повторюваних елементів (наприклад, навігації або футера).

Приклад:

{% include "navbar.html" %}

Фільтри в DTL

truncatechars: обрізка рядків

Не хочете, щоб рядок займав забагато місця? Використовуйте truncatechars!

Приклад:

{{ заголовок|truncatechars:20 }}

Якщо довжина рядка перевищить 20 символів, він буде обрізаний і доповнений трьома крапками.

date: форматування дат

Робота з датами в шаблонах спрощується за допомогою фільтра date.

Приклад:

{{ дата|date:"d M Y" }}

Це перетворить дату у формат 12 Oct 2023.

default: значення за замовчуванням

Якщо змінна — порожня, ви можете вказати значення за замовчуванням за допомогою фільтра default.

Приклад:

{{ ім'я|default:"Гість" }}

length: довжина списку

Як ви бачили раніше, length повертає кількість елементів у списку.

Приклад:

{% if список|length > 10 %}
    <p>Занадто довгий список!</p>
{% endif %}

lower та upper: регістри

Хочете перетворити рядок у нижній або верхній регістр? Вам допоможуть фільтри lower та upper.

Приклад:

{{ текст|lower }}
{{ текст|upper }}

Створюємо свої фільтри

Іноді вам може знадобитися щось унікальне, як власний фільтр! Це більш складний процес, і він реалізується за допомогою Python функції та декоратора @register.filter. Наприклад, фільтр, який додає знак оклику до рядка:

from django import template

register = template.Library()

@register.filter
def add_exclamation(value):
    return f"{value}!"

Потім у шаблоні:

{{ "Привіт"|add_exclamation }}

І ось вам наше "Привіт!"

Приклади використання тегів і фільтрів

Приклад 1: список задач

<h1>Список задач</h1>
<ul>
    {% for task in tasks %}
        <li>
            {% if task.completed %}
                <s>{{ task.name }}</s>
            {% else %}
                {{ task.name }}
            {% endif %}
        </li>
    {% endfor %}
</ul>

Приклад 2: динамічне меню

<ul>
    {% for link in menu %}
        <li>
            <a href="{{ link.url }}">{{ link.title|upper }}</a>
        </li>
    {% endfor %}
</ul>

Вирішення типових помилок

На перших порах ви можете зіткнутися з проблемами при роботі з тегами та фільтрами. Наприклад, однією з поширених помилок є спроба викликати метод об'єкта з круглими дужками (наприклад, {{ об'єкт.метод() }}). У Django шаблонах методи не викликаються напряму! Ви можете або передавати результат методу в контекст, або використовувати готові атрибути об'єкта.

Іншою поширеною помилкою є використання тегів поза парами {% %} або фільтрів без вертикальної риски |. Якщо раптом отримуєте незрозумілі помилки в шаблоні — двічі перевірте синтаксис.

Практична робота

Спробуйте самостійно:

  1. Написати шаблон для відображення списку новин, де кожна новина показується з обрізаним (до 50 символів) текстом.
  2. Реалізувати шаблон сторінки профілю, використовуючи теги {% if %} для перевірки, чи авторизований користувач.
  3. Пограйтеся з іншими фільтрами, наприклад, yesno або default_if_none.

Якщо ви пройшли всі приклади, то поступово починаєте освоювати магію DTL. Далі вас чекає ще більше можливостей для створення професійних веб-застосунків!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ