Django позволяет разделить Python от HTML, Python используется в представлениях, а HTML в шаблонах. Чтобы связать их вместе, Django использует функцию рендеринга и язык шаблонов Django.

Функция рендеринга

Данная функция принимает три параметра:

  • Запрос — первоначальный запрос.
  • Путь к шаблону — путь относительно параметра TEMPLATE_DIRS в переменных файла settings.py.
  • Словарь параметров — словарь, который содержит все переменные, необходимые для шаблона. Он может быть создан вручную, либо же вы можете воспользоваться функцией locals() для передачи всех локальных переменных, объявленных в представлении.

Язык шаблонов Django (DTL)

Движок шаблонов Django предлагает мини-язык для определения пользовательского уровня приложения.

Отображение переменных

Переменная в языке шаблонов Django выглядит следующим образом: {{variable}}. Шаблон заменит данную переменную на переменную, отправленную представлением в третьем параметре функции рендеринга. Давайте изменим наш hello.html для отображения сегодняшней даты:

<html>

   <body>
   Hello World!!!<p>Today is {{today}}</p>
   </body>

</html>

Наше представление изменится и станет выглядеть следующим образом:

def hello(request):
    today = datetime.datetime.now().date()
    return render(request, "hello.html", {"today" : today})

Теперь мы получим следующий вывод при обращении к URL /myapp/hello:

Hello World!!!
Today is Sept. 11, 2015

Как вы, вероятно, заметили, если переменная не является строкой, Django будет использовать метод __str__ для ее отображения; по тому же принципу вы можете получить доступ к атрибутам объекта так же, как вы делаете это в Python. Например, если мы хотим отобразить текущий год, переменная языка шаблонов Django будет выглядеть следующим образом: {{today.year}}.

Фильтры

Они помогают вам изменять переменные во время их отображения. Структура фильтров выглядит следующим образом: {{var | filters}}.

Примеры:

  • {{string | truncatewords: 80}} — этот фильтр будет обрезать строку, поэтому вы увидите только первые 80 слов.
  • {{string | lower}} — преобразует строку в нижний регистр.
  • {{string | escape | linebreaks}} — удаляет содержимое строки, а затем преобразует разрывы строк в теги.

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

Теги

Теги позволяют выполнять следующие операции: условия, циклы, наследование шаблонов и многое другое.

Тег if

Как и в Python, вы можете использовать if, else и elif в своем шаблоне:

<html>
   <body>

    Hello World!!!<p>Today is {{today}}</p>
    We are
    {% if today.day == 1 %}
    
    the first day of month.
    {% elif today.day == 30 %}
    
    the last day of month.
    {% else %}
    
    I don't know.
    {%endif%}

   </body>
</html>

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

Тег for

Как и в случае с if, у нас есть тег for, который работает точно так же, как в Python. Давайте изменим наше представление приветствия, чтобы передать список в наш шаблон:

def hello(request):
    today = datetime.datetime.now().date()
    
    daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})

Шаблон для отображения этого списка с помощью {{for}}:

<html>
   <body>
    
    Hello World!!!<p>Today is {{today}}</p>
    We are
    {% if today.day == 1 %}
    
    the first day of month.
    {% elif today.day == 30 %}
    
    the last day of month.
    {% else %}
    
    I don't know.
    {%endif%}
    
       <p>
          {% for day in days_of_week %}
          {{day}}
       </p>
    
    {% endfor %}

   </body>
</html>

Мы должны получить следующее:

Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun

Теги block и extend

Система шаблонов не может быть полной без наследования шаблонов. Это означает, что при разработке ваших шаблонов у вас должен быть основной шаблон с пропусками, которые дочерний шаблон будет заполнять в соответствии со своими потребностями, например, странице может потребоваться специальный CSS для выбранной вкладки. Давайте изменим шаблон hello.html для наследования от main_template.html.

main_template.html

<html>
   <head>

   <title>
      {% block title %}Page Title{% endblock %}
   </title>

   </head>

   <body>

    {% block content %}
    Body content
    {% endblock %}

   </body>
</html>

hello.html

{% extend "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today.day == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

В приведенном выше примере при обращении к /myapp/hello мы все равно получим тот же результат, что и раньше, но теперь мы полагаемся на extend и block для рефакторинга нашего кода.

В main_template.html мы определяем блоки с помощью тега block. Блок заголовка будет содержать заголовок страницы, а блок контента будет содержать основное содержимое страницы. В home.html мы используем extend для наследования от main_template.html, а затем заполняем определенные выше блоки (content и title).

Тег comment

Данный тег помогает определять комментарии в шаблонах, а не комментарии HTML, они не будут отображаться на HTML-страницах. Это может быть полезно для документации или просто комментирования строк кода.

Источник: Django — Template System