Делюсь своей реализацией встроенных тегов для формирования breadcrumb с поддержкой разметки schema.org, а также поддержкой bootstrap css.
Написал эти теги, чтобы ускорить скорость разработки сайта. Теперь работа продвигается намного быстрее, потому что код стал более компактным, а исправлять ошибки в разметке хлебных крошек стало намного проще, так как теперь исправлять код нужно только в одном месте.
Допустим, у вас есть ядро приложения, которое отвечает за какой-то общий функционал и в нем есть директория template_tags с файлом core.py для формирования всех встроенных тегов. Добавьте 3 тега включения и один простой тег, чтобы сформировать 4 компонента хлебной крошки.
- breadcrumb_schema - сохранить текущую схему из разметки schema.org
- breadcrumb_home - для формирования корня сайта
- breadcrumb_item - для формирования элементов дерева структуры сайта
- breadcrumb_active - для формирования элемента текущей страницы сайта
core.py
Посмотрите на содержимое файла python с этими тегами.
- # -*- coding: utf-8 -*-
- from django import template
- register = template.Library()
- @register.simple_tag
- def breadcrumb_schema():
- return "http://schema.org/BreadcrumbList"
- @register.inclusion_tag('core/breadcrumb_home.html')
- def breadcrumb_home(url='/', title=''):
- return {
- 'url': url,
- 'title': title
- }
- @register.inclusion_tag('core/breadcrumb_item.html')
- def breadcrumb_item(url, title, position):
- return {
- 'url': url,
- 'title': title,
- 'position': position
- }
- @register.inclusion_tag('core/breadcrumb_active.html')
- def breadcrumb_active(url, title, position):
- return {
- 'url': url,
- 'title': title,
- 'position': position
- }
Если с тегом breadcrumb_schema() все понятно, он просто возвращает определение схемы разметки, то с другими тегами вопросов больше.
Вся разметка формируется из трех основных параметров:
- url - ссылка на страницу товара
- title - Заголовок страницы
- position - все элементы в разметке должны быть пронумерованы. Например, 0, 1, 2, 3 и т. д.
Для breadcrumb_home() я не добавляю никакой позиции, потому что в ней нет смысла, всегда будет позиция 0. Кроме того, в моем случае вместо заголовка иконка, поэтому шаблон будет иметь другой вид. один.
В случае двух других тегов нам нужно будет указать позицию.
Шаблоны
Сразу оговорюсь про домашнюю иконку. Я использую пакет Material Design Icons , поэтому будет тег span с классами mdi mdi-home .
breadcrumb_home.html
- <li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
- <a itemprop="item" href="{{ url }}">
- <span class="mdi mdi-home">
- <span class="d-none" itemprop="name">{{ title }}</span>
- </span>
- </a>
- <meta itemprop="position" content="1" />
- </li>
breadcrumb_item.html
- <li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
- <a itemprop="item" href="{{ url }}">
- <span itemprop="name">{{ title }}</span>
- </a>
- <meta itemprop="position" content="{{ position }}" />
- </li>
breadcrumb_active.html
- <li class="breadcrumb-item active" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
- <link itemprop="item" href="{{ url }}">
- <span itemprop="name">{{ title }}</span>
- <meta itemprop="position" content="{{ position }}" />
- </li>
Applying tags in a template
Ну и приведу кусок кода из шаблона статьи, где это применяется в боевых условиях.
- {% extends 'home/base.html' %}
- {% load core %}
- <ul class="breadcrumb bg-light" itemscope itemtype="{% breadcrumb_schema %}">
- {% url 'home:index' as home_index_url %}
- {% breadcrumb_home home_index_url 'EVILEG' %}
- {% url 'knowledge:index' as knowledge_index_url %}
- {% breadcrumb_item knowledge_index_url _('Articles') 2 %}
- {% breadcrumb_item article.section.get_absolute_url article.section.title 3 %}
- {% breadcrumb_active article.get_absolute_url article.title 4 %}
- </ul>
Вывод
А теперь представьте, что вместо этих 9 строк в шаблоне статьи вам пришлось бы прописывать каждый компонент для правильной разметки. Количество строк кода увеличилось бы втрое, а с увеличением этого монотонного функционала становится сложнее поддерживать код сайта и быстро его исправлять.