Evgenii Legotckoi
6 января 2019 г. 18:48

Django - Урок 043. template tags для формирования breadcrumb с поддержкой shema.org

Делюсь своей реализацией встроенных тегов для формирования breadcrumb с поддержкой разметки schema.org, а также поддержкой bootstrap css.

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


Допустим, у вас есть ядро приложения, которое отвечает за какой-то общий функционал и в нем есть директория template_tags с файлом core.py для формирования всех встроенных тегов. Добавьте 3 тега включения и один простой тег, чтобы сформировать 4 компонента хлебной крошки.

  • breadcrumb_schema - сохранить текущую схему из разметки schema.org
  • breadcrumb_home - для формирования корня сайта
  • breadcrumb_item - для формирования элементов дерева структуры сайта
  • breadcrumb_active - для формирования элемента текущей страницы сайта

core.py

Посмотрите на содержимое файла python с этими тегами.

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django import template
  4.  
  5. register = template.Library()
  6.  
  7.  
  8. @register.simple_tag
  9. def breadcrumb_schema():
  10. return "http://schema.org/BreadcrumbList"
  11.  
  12.  
  13. @register.inclusion_tag('core/breadcrumb_home.html')
  14. def breadcrumb_home(url='/', title=''):
  15. return {
  16. 'url': url,
  17. 'title': title
  18. }
  19.  
  20.  
  21. @register.inclusion_tag('core/breadcrumb_item.html')
  22. def breadcrumb_item(url, title, position):
  23. return {
  24. 'url': url,
  25. 'title': title,
  26. 'position': position
  27. }
  28.  
  29.  
  30. @register.inclusion_tag('core/breadcrumb_active.html')
  31. def breadcrumb_active(url, title, position):
  32. return {
  33. 'url': url,
  34. 'title': title,
  35. 'position': position
  36. }

Если с тегом breadcrumb_schema() все понятно, он просто возвращает определение схемы разметки, то с другими тегами вопросов больше.

Вся разметка формируется из трех основных параметров:

  • url - ссылка на страницу товара
  • title - Заголовок страницы
  • position - все элементы в разметке должны быть пронумерованы. Например, 0, 1, 2, 3 и т. д.

Для breadcrumb_home() я не добавляю никакой позиции, потому что в ней нет смысла, всегда будет позиция 0. Кроме того, в моем случае вместо заголовка иконка, поэтому шаблон будет иметь другой вид. один.

В случае двух других тегов нам нужно будет указать позицию.

Шаблоны

Сразу оговорюсь про домашнюю иконку. Я использую пакет Material Design Icons , поэтому будет тег span с классами mdi mdi-home .

breadcrumb_home.html

  1. <li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
  2. <a itemprop="item" href="{{ url }}">
  3. <span class="mdi mdi-home">
  4. <span class="d-none" itemprop="name">{{ title }}</span>
  5. </span>
  6. </a>
  7. <meta itemprop="position" content="1" />
  8. </li>

breadcrumb_item.html

  1. <li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
  2. <a itemprop="item" href="{{ url }}">
  3. <span itemprop="name">{{ title }}</span>
  4. </a>
  5. <meta itemprop="position" content="{{ position }}" />
  6. </li>

breadcrumb_active.html

  1. <li class="breadcrumb-item active" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
  2. <link itemprop="item" href="{{ url }}">
  3. <span itemprop="name">{{ title }}</span>
  4. <meta itemprop="position" content="{{ position }}" />
  5. </li>

Applying tags in a template

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

  1. {% extends 'home/base.html' %}
  2. {% load core %}
  3. <ul class="breadcrumb bg-light" itemscope itemtype="{% breadcrumb_schema %}">
  4. {% url 'home:index' as home_index_url %}
  5. {% breadcrumb_home home_index_url 'EVILEG' %}
  6. {% url 'knowledge:index' as knowledge_index_url %}
  7. {% breadcrumb_item knowledge_index_url _('Articles') 2 %}
  8. {% breadcrumb_item article.section.get_absolute_url article.section.title 3 %}
  9. {% breadcrumb_active article.get_absolute_url article.title 4 %}
  10. </ul>

Вывод

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

Рекомендуемые статьи по этой тематике

По статье задано0вопрос(ов)

1

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь