Skip to main content

django-view-breadcrumbs

Test Codacy Badge pre-commit.ci status Codacy Badge PyPI version

PyPI - Django Version PyPI - Python Version Downloads

All Contributors

Table of Contents

Background

This package provides a set of breadcrumb mixin classes that can be added to any django class based view and requires adding just {% render_breadcrumbs %} to the base template.

breadcrumbs

In the base.html template add the render_breadcrumbs tag and any template that inherits the base should have breadcrumbs included.

Example:

my_app
   |--templates
            |--base.html
            |--create.html

base.html

{% load view_breadcrumbs %}

{% block breadcrumbs %}
    {% render_breadcrumbs %} {# Optionally provide a custom template e.g {% render_breadcrumbs "view_breadcrumbs/bootstrap5.html" %} #}
{% endblock %}

And your create.html.

{% extends "base.html" %}

Installation

$ pip install django-view-breadcrumbs

Add view_breadcrumbs to your INSTALLED_APPS

INSTALLED_APPS = [
    ...,
    "view_breadcrumbs",
    ...,
]

Breadcrumb mixin classes provided.

  • BaseBreadcrumbMixin - Subclasses requires a crumbs class property.
  • CreateBreadcrumbMixin - For create views Home / Posts / Add Post
  • DetailBreadcrumbMixin - For detail views Home / Posts / Post 1
  • ListBreadcrumbMixin - For list views Home / Posts
  • UpdateBreadcrumbMixin - For Update views Home / Posts / Post 1 / Update Post 1
  • DeleteBreadcrumbMixin - For Delete views this has a link to the list view to be used as the success URL.

Settings

NOTE :warning:

  • Make sure that "django.template.context_processors.request" is added to your TEMPLATE OPTIONS setting.
TEMPLATES  = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request", # <- This context processor is required
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

Modify the defaults using the following:

Name Default Description Options
BREADCRUMBS_TEMPLATE "view_breadcrumbs/bootstrap5.html" Template used to render breadcrumbs. Predefined Templates
BREADCRUMBS_HOME_LABEL Home Default label for the root path

Customization

BREADCRUMBS_TEMPLATE

Site wide
BREADCRUMBS_TEMPLATE = "my_app/breadcrumbs.html"
Overriding the breadcrumb template for a single view

Update the base.html

{% render_breadcrumbs "my_app/breadcrumbs.html" %}

BREADCRUMBS_HOME_LABEL

Site wide
BREADCRUMBS_HOME_LABEL = "My new home"
Overriding the Home label for a specific view
from django.utils.translation import gettext_lazy as _
from view_breadcrumbs import DetailBreadcrumbMixin
from django.views.generic import DetailView
from demo.models import TestModel


class TestDetailView(DetailBreadcrumbMixin, DetailView):
     model = TestModel
     home_label = _("My new home")
     template_name = "demo/test-detail.html"

Renders

custom-root-breadcrumb

Translation support

Example

translated-crumbs

Usage

django-view-breadcrumbs includes generic mixins that can be added to a class based view.

Using the generic breadcrumb mixin each breadcrumb will be added to the view dynamically and can be overridden by providing a crumbs property.

View Configuration

NOTE: :warning:

  • Model based views should use a pattern view_name=model_verbose_name_{action}
Actions View Class View name Sample Breadcrumb Example
list ListView {model.verbose_name}_list Home / Posts Posts Example
create CreateView {model.verbose_name}_create Home / Posts / Add Post
detail DetailView {model.verbose_name}_detail Home / Posts / Test - Post
change UpdateView {model.verbose_name}_update Home / Posts / Test - Post / Update Test - Post
delete DeleteView {model.verbose_name}_delete N/A
N/A TemplateView N/A N/A See: Custom View
N/A FormView N/A N/A See: Custom View
N/A AboutView N/A N/A See: Custom View
N/A View N/A N/A See: Custom View

django-tables-2

Actions View Class View name Sample Breadcrumb Example
N/A SingleTableMixin N/A N/A See: demo table view
N/A MultiTableMixin N/A N/A See: demo table view
N/A SingleTableView N/A N/A Same implementation as SingleTableMixin

For more examples see: demo app

URL Configuration

Based on the table of actions listed above there's a strict view_name requirement that needs to be adhered to in order for breadcrumbs to work.

This can be manually entered in your urls.py or you can optionally use the following class properties instead of hardcoding the view_name.

...
    path("tests/", TestListsView.as_view(), name=TestListsView.list_view_name),
    path(
        "tests/<slug:slug>/",
        TestDetailView.as_view(),
        name=TestDetailView.detail_view_name,
    ),
    path(
        "tests/<slug:slug>/update/",
        TestUpdateView.as_view(),
        name=TestUpdateView.update_view_name,
    ),
    path(
        "tests/<slug:slug>/delete/",
        TestDeleteView.as_view(),
        name=TestDeleteView.delete_view_name,
    ),
...

Examples

Sample crumbs: Posts

In your urls.py

  urlpatterns = [
      ...
      path("posts/", views.PostList.as_view(), name="post_list"),
      ...
      # OR
      ...
      path("posts/", views.PostList.as_view(), name=views.PostList.list_view_name),
      ...
  ]

All crumbs use the home root path / as the base this can be excluded by specifying add_home = False

from django.views.generic import ListView
from view_breadcrumbs import ListBreadcrumbMixin


class PostList(ListBreadcrumbMixin, ListView):
    model = Post
    template_name = "app/post/list.html"
    add_home = False

Sample crumbs: Home / Posts / Test - Post

In your urls.py

  urlpatterns = [
      ...
      path("posts/<slug:slug>/", views.PostDetail.as_view(), name="post_detail"),
      ...
      # OR
      ...
      path("posts/<slug:slug>/", views.PostDetail.as_view(), name=views.PostDetail.detail_view_name),
      ...
  ]

views.py

from django.views.generic import DetailView
from view_breadcrumbs import DetailBreadcrumbMixin


class PostDetail(DetailBreadcrumbMixin, DetailView):
    model = Post
    template_name = "app/post/detail.html"
    breadcrumb_use_pk = False

Custom crumbs: Home / My Test Breadcrumb

URL configuration.

    urlpatterns = [
       path("my-custom-view/", views.CustomView.as_view(), name="custom_view"),
    ]

views.py

from django.urls import reverse
from django.views.generic import View
from view_breadcrumbs import BaseBreadcrumbMixin
from demo.models import TestModel


class CustomView(BaseBreadcrumbMixin, View):
    model = TestModel
    template_name = "app/test/custom.html"
    crumbs = [("My Test Breadcrumb", reverse("custom_view"))]  # OR reverse_lazy

OR

from django.urls import reverse
from django.views.generic import View
from view_breadcrumbs import BaseBreadcrumbMixin
from demo.models import TestModel
from django.utils.functional import cached_property


class CustomView(BaseBreadcrumbMixin, View):
    template_name = "app/test/custom.html"

    @cached_property
    def crumbs(self):
        return [("My Test Breadcrumb", reverse("custom_view"))]

Refer to the demo app for more examples.

Using multiple apps

To reference models from a different application you need to override the app_name class attribute.

Example: Using a Library model that is imported from a custom application that you want to render in a demo app view.

INSTALLED_APPS =  [
    ...
    "demo",
    "custom",
    ...
]

demo/views.py

class LibraryDetailView(DetailBreadcrumbMixin, DetailView):
    model = Library
    app_name = "demo"
    ...

Running locally

$ git clone git@github.com:tj-django/django-view-breadcrumbs.git
$ make install-dev
$ make migrate
$ make run

Spins up a django server running the demo app.

Visit http://127.0.0.1:8090

Credits

To file a bug or submit a patch, please head over to django-view-breadcrumbs on github.

If you feel generous and want to show some extra appreciation:

Support me with a :star:

Buy me a coffee

Contributors ✨

Thanks goes to these wonderful people (emoji key):


Derek

📖

David THENON

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

Metadata

Release files for django-view-breadcrumbs 2.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-view-breadcrumbs 2.5.1
File Size Uploaded Provenance
django-view-breadcrumbs-2.5.1.tar.gz 47.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for django-view-breadcrumbs 2.5.1
File Interpreter ABI Platform
django_view_breadcrumbs-2.5.1-py3-none-any.whl Python 3 none any Details

Total release size: 73.5 kB

Release files / django-view-breadcrumbs-2.5.1.tar.gz

Download URL django-view-breadcrumbs-2.5.1.tar.gz
Size 47.7 kB
Tags Source
SHA-256 checksum
How to use checksums
b214c3758f6159d1ad8d76a21e7430a9f208be52fc79ba021e13a2ee675dbb3b
BLAKE2b-256 checksum
How to use checksums
a79625123c58f6f4a5dc207f285a0c0ddaad106792b603bdd7687e2dedc39ea5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/6.8.0 pkginfo/1.9.6 requests/2.31.0 requests-toolbelt/1.0.0 tqdm/4.66.1 CPython/3.11.6

Release files / django_view_breadcrumbs-2.5.1-py3-none-any.whl

Download URL django_view_breadcrumbs-2.5.1-py3-none-any.whl
Size 25.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0405af06d416c661edfea8d0b5023b37ec016edfb9ce8646c6b4a39127d48620
BLAKE2b-256 checksum
How to use checksums
95c971dd2ed51e24a236b8267ddfa1ab2863647468f7a720aaa6151c336057a5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.1 importlib_metadata/6.8.0 pkginfo/1.9.6 requests/2.31.0 requests-toolbelt/1.0.0 tqdm/4.66.1 CPython/3.11.6

Security for django-view-breadcrumbs 2.5.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

2.5.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page