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