Ділюсь своєю реалізацією вбудованих тегів для формування 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>
Застосування тегів у шаблоні
Ну і наведу шматок коду із шаблону статті, де це застосовується у бойових умовах.
{% 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 рядків у шаблоні статті вам довелося прописувати кожен компонент для правильної розмітки. Кількість рядків коду збільшилася б утричі, а зі збільшенням цього монотонного функціоналу стає складніше підтримувати код сайту та швидко його виправляти.