Evgenii Legotckoi
Evgenii LegotckoiJan. 6, 2019, 7:48 a.m.

Django - Tutorial 043. template tags to form breadcrumb with shema.org support

I share my implementation of built-in tags to form breadcrumbs with support for schema.org markup, as well as support for bootstrap css.

Wrote these tags to speed up site development speed. Now the work moves much faster, because the code has become more compact, and correcting errors in the breadcrumbs markup has become much easier, since now you only need to correct the code in one place.

Suppose you have a core application that is responsible for some common functionality and it has a directory template_tags with the file core.py for the formation of all embedded tags. Add 3 inclusion tags and one simple tag to form 4 breadcrumb components.

  • breadcrumb_schema - to keep current schema from schema.org markup
  • breadcrumb_home - to form the root of the site
  • breadcrumb_item - to form elements of the site structure tree
  • breadcrumb_active - to form an element of the current page of the site


Look at the contents of the python file with these tags.

# -*- coding: utf-8 -*-

from django import template

register = template.Library()

def breadcrumb_schema():
    return "http://schema.org/BreadcrumbList"

def breadcrumb_home(url='/', title=''):
    return {
        'url': url,
        'title': title

def breadcrumb_item(url, title, position):
    return {
        'url': url,
        'title': title,
        'position': position

def breadcrumb_active(url, title, position):
    return {
        'url': url,
        'title': title,
        'position': position

If everything is clear with the breadcrumb_schema () tag, it simply returns the definition of the markup scheme, then there are more questions with other tags.

All markup is formed from three main parameters:

  • url - link to the item page
  • title - page title
  • position - all elements in the markup should be numbered. For example, 0, 1, 2, 3, etc.

For breadcrumb_home() I do not add any position because there is no point in it, there will always be position 0. Besides, in my case there is an icon instead of a title, so the template will have a different one.

In the case of the other two tags, we will need to specify the position.


Immediately make a reservation about the home icon. I use the Material Design Icons package, so there will be a span tag with classes mdi mdi-home .


<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>
    <meta itemprop="position" content="1" />


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


<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 }}" />

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 %}


Now imagine that instead of these 9 lines in the article template, you would have to write each component for proper markup. The number of lines the code would increase threefold, and with the increase of this monotonous functionality, it becomes more difficult to maintain the code of the site and quickly fix it.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!


Only authorized users can post comments.
Please, Log in or Sign up

C++ - Test 002. Constants

  • Result:41points,
  • Rating points-8

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
Last comments
Evgenii Legotckoi
Evgenii LegotckoiDec. 3, 2023, 8:39 a.m.
Django - Lesson 059. Saving the selected language in user settings It is redirect from untranslated url to translated url. It is normal behavior for mutlilanguage web site based on the Django.
coder55Dec. 1, 2023, 5:34 p.m.
Django - Lesson 059. Saving the selected language in user settings It tries to do language translation in API views. That's why it sends or receives the same API request twice. Do you have any suggestions on this? Example: stripe webhook. "GET /warehouse/…
gr1047Nov. 12, 2023, 10:35 a.m.
Qt/C++ - Lesson 035. Downloading files via HTTP with QNetworkAccessManager Добрый день. Изучаю Qt на ваших уроках. Всё нормально работает на Linux. А под Win один раз запустилось, а сейчас вместо данных сайта получается ошибк "Unable to write". Куда копать, ума не…
DamirNov. 2, 2023, 3:41 a.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers С CMake всё на много проще: find_package(Boost)
Павел Дорофеев
Павел ДорофеевOct. 28, 2023, 2:48 p.m.
Как написать свой QTableView Итак начинаем писать свои виджеты на основе QAbstractItemView. А что так можно было?
Now discuss on the forum
BlinCTNov. 30, 2023, 9:18 a.m.
Сборка проекта Qt6 из под винды на удаленой машине Всем привет. Сталкнулся с такой странностью: надо собирать проект из под 10 винды на удаленой линуксовой машине, проект строится на QT6, но вот когда cmake генерит свой кеш то вылитает…
Evgenii Legotckoi
Evgenii LegotckoiNov. 19, 2023, 8:14 a.m.
CKEditor 5 и подсветка синтаксиса. Добрый день. Я устал разбираться с CKEditor и просто перешёл на использование самописного markdown редактора...
Виктор Калесников
Виктор КалесниковOct. 20, 2023, 4:29 a.m.
Контакты Android делал в далеком 2017г поэтому особенно ничего не подскажу. Это основные методы получения данных с андроида используя Qt. Там еще какоето колдунство с манифестом. Андроидом давно не занимаюс…
mihamuzOct. 18, 2023, 2:03 p.m.
Скачать Qt 6 Сработал следующий алгоритм. Инстолятор скачал используя это https://freevpnplanet.com/ru/ как расширение браузера. Потом установил это https://freevpnplanet.com/ru/ же на ПК и через инстолятор …

Follow us in social networks