English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Система шаблонов Django

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

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

Эта функция имеет три параметра −

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

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

Моторны Django предоставляет малый язык для определения пользовательского интерфейса приложения.

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

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

hello.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
<html> 
    <body>
       Hello World!!!<p>Сегодня {{today}}</p>
    </body> 
 </html>

Затем, наш вид будет изменен на -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
def hello(request):
    today = datetime.datetime.now().date()
    return render(request, "hello.html", {"today": today})

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

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
Привет, мир!!!
 Сегодня 11 сентября, 2015

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

Фильтры

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

Пример

− Фильтр укорачивает строку, поэтому видны только первые 80 символов.

       − Преобразование символов в строчную букву            {{string|escape|linebreaks}} − Escape string content, then convert line breaks to tags.    

Можно также установить переменные по умолчанию.

теги

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

теги if

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

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       Hello World!!!<p>Сегодня {{today}}</p>
       Мы здесь
       {% if today.day == 1 %}
       первый день месяца.
       {% elif today == 30 %}
       последний день месяца.
       {% else %}
       Я не знаю.
       {% endif %}
    </body>
 </html>

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

теги for

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

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
def hello(request):
    today = datetime.datetime.now().date()
    daysOfWeek = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Вс', 'Сб']
    return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})

Этот шаблон используется для показа списка {{ for }} −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
<html>
    <body>
       Hello World!!!<p>Сегодня {{today}}</p>
       Мы здесь
       {% if today.day == 1 %}
       первый день месяца.
       {% elif today == 30 %}
       последний день месяца.
       {% else %}
       Я не знаю.
       {% endif %}
       <p>
          {% for day in days_of_week %}
          {{day}}
       </p>
 
       {% endfor %}
    </body>
 </html>

Мы должны получить выходной содержимое, как следует −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
Привет, мир!!!
 Сегодня 11 сентября, 2015
 Мы не знаем.
 Пн
 Вт
 Ср
 Пт
 Чт
 Вс
 Сб

Блоки и теги расширения

Система шаблонов является несовершенной системой наследования шаблонов. Когда вы проектируете смысл шаблона, подшаблон заполняет главный шаблон в зависимости от своих потребностей, как, например, могут потребоваться особые CSS для выбранной вкладки на странице.

Давайте изменить шаблон hello.html, чтобы он наследовал main_template.html.

main_template.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
<html>
    <head> 
       <title>
          {% block title %}Page Title{% endblock %}
       </title> 
    </head>
 
    <body> 
       {% block content %}
          Body content
       {% endblock %} 
    </body>
 </html>

hello.html

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
{% extends "main_template.html" %}
 {% block title %}Моя страница Привет{% endblock %}
 {% block content %}
 Hello World!!!<p>Сегодня {{today}}</p>
 Мы здесь
 {% if today.day == 1 %}
 первый день месяца.
 {% elif today == 30 %}
 последний день месяца.
 {% else %}
 Я не знаю.
 {% endif %}
 <p>
    {% for day in days_of_week %}
    {{day}}
 </p>
 {% endfor %}
 {% endblock %}

В上面的 примере, при вызове /myapp/hello, мы все еще получаем такой же результат, как и раньше,但现在 мы используем расширение, и не нужно重构 код-−

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

Теги комментариев

Теги комментариев используются для определения комментариев в шаблонах, а не HTML комментариев, они не будут出现在 странице HTML. Это может быть файл или просто строка комментария в коде.