django-view-breadcrumbs


Namedjango-view-breadcrumbs JSON
Version 2.5.1 PyPI version JSON
download
home_pagehttps://github.com/tj-django/django-view-breadcrumbs
SummaryDjango generic view breadcrumbs
upload_time2023-11-07 01:28:13
maintainer
docs_urlNone
authorTonye Jack
requires_python>=3.6
license
keywords django breadcrumbs breadcrumbs django generic views breadcrumb
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            # django-view-breadcrumbs

[![Test](https://github.com/tj-django/django-view-breadcrumbs/actions/workflows/test.yml/badge.svg)](https://github.com/tj-django/django-view-breadcrumbs/actions/workflows/test.yml) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/537b0ce56e744f078f17cc8ccd4200d8)](https://www.codacy.com/gh/tj-django/django-view-breadcrumbs/dashboard?utm_source=github.com\&utm_medium=referral\&utm_content=tj-django/django-view-breadcrumbs\&utm_campaign=Badge_Grade) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/tj-django/django-view-breadcrumbs/main.svg)](https://results.pre-commit.ci/latest/github/tj-django/django-view-breadcrumbs/main) [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/537b0ce56e744f078f17cc8ccd4200d8)](https://www.codacy.com/gh/tj-django/django-view-breadcrumbs/dashboard?utm_source=github.com\&utm_medium=referral\&utm_content=tj-django/django-view-breadcrumbs\&utm_campaign=Badge_Coverage) [![PyPI version](https://badge.fury.io/py/django-view-breadcrumbs.svg)](https://badge.fury.io/py/django-view-breadcrumbs)

![PyPI - Django Version](https://img.shields.io/pypi/djversions/django-view-breadcrumbs) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/django-view-breadcrumbs)
[![Downloads](https://static.pepy.tech/badge/django-view-breadcrumbs)](https://pepy.tech/project/django-view-breadcrumbs)

<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->

[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-)

<!-- ALL-CONTRIBUTORS-BADGE:END -->

## Table of Contents

*   [Background](#background)
*   [Installation](#installation)
    *   [Add `view_breadcrumbs` to your INSTALLED\_APPS](#add-view_breadcrumbs-to-your-installed_apps)
*   [Breadcrumb mixin classes provided.](#breadcrumb-mixin-classes-provided)
*   [Settings](#settings)
    *   [Customization](#customization)
        *   [BREADCRUMBS\_TEMPLATE](#breadcrumbs_template)
            *   [Site wide](#site-wide)
            *   [Overriding the breadcrumb template for a single view](#overriding-the-breadcrumb-template-for-a-single-view)
        *   [BREADCRUMBS\_HOME\_LABEL](#breadcrumbs_home_label)
            *   [Site wide](#site-wide-1)
            *   [Overriding the Home label for a specific view](#overriding-the-home-label-for-a-specific-view)
*   [Translation support](#translation-support)
    *   [Example](#example)
*   [Usage](#usage)
    *   [View Configuration](#view-configuration)
        *   [django-tables-2](#django-tables-2)
    *   [URL Configuration](#url-configuration)
    *   [Examples](#examples)
        *   [Sample crumbs: `Posts`](#sample-crumbs-posts)
        *   [Sample crumbs:  `Home / Posts / Test - Post`](#sample-crumbs--home--posts--test---post)
        *   [Custom crumbs: `Home / My Test Breadcrumb`](#custom-crumbs-home--my-test-breadcrumb)
    *   [Using multiple apps](#using-multiple-apps)
*   [Running locally](#running-locally)
*   [Credits](#credits)
*   [Contributors ✨](#contributors-)

## 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.

<img width="1438" alt="breadcrumbs" src="https://user-images.githubusercontent.com/17484350/128493747-776706bf-d46c-4b57-ba54-c64fcc71ada7.png">

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`

```jinja2
{% 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`.

```jinja2
{% extends "base.html" %}
```

## Installation

```bash
$ pip install django-view-breadcrumbs

```

### Add `view_breadcrumbs` to your INSTALLED\_APPS

```python

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.

```python
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](https://github.com/tj-django/django-view-breadcrumbs/tree/main/view_breadcrumbs/templates/view_breadcrumbs)                 |
| `BREADCRUMBS_HOME_LABEL`   |  `Home`                                     |  Default label for the root path  |         |

### Customization

#### BREADCRUMBS\_TEMPLATE

##### Site wide

```python
BREADCRUMBS_TEMPLATE = "my_app/breadcrumbs.html"
```

##### Overriding the breadcrumb template for a single view

Update the `base.html`

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

#### BREADCRUMBS\_HOME\_LABEL

##### Site wide

```python
BREADCRUMBS_HOME_LABEL = "My new home"
```

##### Overriding the Home label for a specific view

```python
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*

<img width="436" alt="custom-root-breadcrumb" src="https://user-images.githubusercontent.com/17484350/128493798-c71a8071-e913-4875-80b6-c7b414ac4e24.png">

## [Translation support](https://docs.djangoproject.com/en/3.1/topics/i18n/translation/)

### Example

![translated-crumbs](https://user-images.githubusercontent.com/17484350/128493830-7e50a6a9-3648-48cb-b198-4646ee2b03cf.png)

## 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`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-display/#listview)  | `{model.verbose_name}_list` |  `Home / Posts`  |  [Posts Example](https://github.com/tj-django/django-view-breadcrumbs#sample-crumbs-posts) |
| `create`  | [`CreateView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-editing/#createview) | `{model.verbose_name}_create` | `Home / Posts / Add Post` |  |
| `detail`  | [`DetailView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-display/#detailview) | `{model.verbose_name}_detail` | `Home / Posts / Test - Post` |  |
| `change`  | [`UpdateView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-editing/#updateview) | `{model.verbose_name}_update` | `Home / Posts / Test - Post / Update Test - Post` |  |
| `delete`  | [`DeleteView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-editing/#deleteview) | `{model.verbose_name}_delete` | N/A |
|   N/A     | [`TemplateView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/base/#templateview) | N/A  | N/A |  See: [Custom View](#custom-crumbs-home--my-test-breadcrumb) |
|   N/A     | [`FormView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-editing/#formview) | N/A  | N/A |  See: [Custom View](#custom-crumbs-home--my-test-breadcrumb) |
|   N/A     | [`AboutView`](https://docs.djangoproject.com/en/3.2/topics/class-based-views/#subclassing-generic-views) | N/A  | N/A |  See: [Custom View](#custom-crumbs-home--my-test-breadcrumb) |
|   N/A     | [`View`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/base/#view) | N/A  | N/A |  See: [Custom View](#custom-crumbs-home--my-test-breadcrumb) |

#### [django-tables-2](https://django-tables2.readthedocs.io/en/latest/index.html#)

|  Actions  |  View Class |  View name  | Sample Breadcrumb | Example  |
|-----------|-------------|-------------|-------------------|----------|
|   N/A     | [`SingleTableMixin`](https://django-tables2.readthedocs.io/en/latest/pages/generic-mixins.html?highlight=SingleTableMixin#a-single-table-using-singletablemixin) | N/A  | N/A |  See: [demo table view](https://github.com/tj-django/django-view-breadcrumbs/blob/main/demo/views.py#L154-L162) |
|   N/A     | [`MultiTableMixin`](https://django-tables2.readthedocs.io/en/latest/pages/generic-mixins.html?highlight=SingleTableMixin#multiple-tables-using-multitablemixin) | N/A  | N/A |  See: [demo table view](https://github.com/tj-django/django-view-breadcrumbs/blob/main/demo/views.py#L166-L173) |
|   N/A     | [`SingleTableView`](https://django-tables2.readthedocs.io/en/latest/pages/api-reference.html?highlight=SingleTableView#singletableview) | N/A  | N/A |  Same implementation as `SingleTableMixin` |

For more examples see: [demo app](https://github.com/tj-django/django-view-breadcrumbs/tree/main/demo)

### 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`.

```python
...
    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

```python
  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`

```python
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`

```python
  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`

```python
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.

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

views.py

```python
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**

```python
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](https://github.com/tj-django/django-view-breadcrumbs/tree/main/demo) 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.

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

`demo/views.py`

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

## Running locally

```bash
$ 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

*   [django-bootstrap-breadcrumbs](https://github.com/prymitive/bootstrap-breadcrumbs)

To file a bug or submit a patch, please head over to [django-view-breadcrumbs on github](https://github.com/tj-django/django-view-breadcrumbs/issues).

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

Support me with a :star:

[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee]

[buymeacoffee]: https://www.buymeacoffee.com/jackton1

[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png

## Contributors ✨

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->

<!-- prettier-ignore-start -->

<!-- markdownlint-disable -->

<table>
  <tr>
    <td align="center"><a href="https://fansourcedpoisontour.com"><img src="https://avatars3.githubusercontent.com/u/1037197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Derek</b></sub></a><br /><a href="https://github.com/tj-django/django-view-breadcrumbs/commits?author=KrunchMuffin" title="Documentation">📖</a></td>
    <td align="center"><a href="http://www.emencia.com"><img src="https://avatars.githubusercontent.com/u/1572165?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David THENON</b></sub></a><br /><a href="https://github.com/tj-django/django-view-breadcrumbs/commits?author=sveetch" title="Code">💻</a></td>
  </tr>
</table>

<!-- markdownlint-restore -->

<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/tj-django/django-view-breadcrumbs",
    "name": "django-view-breadcrumbs",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": "",
    "keywords": "django breadcrumbs,breadcrumbs,django generic views breadcrumb",
    "author": "Tonye Jack",
    "author_email": "jtonye@ymail.com",
    "download_url": "https://files.pythonhosted.org/packages/a7/96/25123c58f6f4a5dc207f285a0c0ddaad106792b603bdd7687e2dedc39ea5/django-view-breadcrumbs-2.5.1.tar.gz",
    "platform": null,
    "description": "# django-view-breadcrumbs\n\n[![Test](https://github.com/tj-django/django-view-breadcrumbs/actions/workflows/test.yml/badge.svg)](https://github.com/tj-django/django-view-breadcrumbs/actions/workflows/test.yml) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/537b0ce56e744f078f17cc8ccd4200d8)](https://www.codacy.com/gh/tj-django/django-view-breadcrumbs/dashboard?utm_source=github.com\\&utm_medium=referral\\&utm_content=tj-django/django-view-breadcrumbs\\&utm_campaign=Badge_Grade) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/tj-django/django-view-breadcrumbs/main.svg)](https://results.pre-commit.ci/latest/github/tj-django/django-view-breadcrumbs/main) [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/537b0ce56e744f078f17cc8ccd4200d8)](https://www.codacy.com/gh/tj-django/django-view-breadcrumbs/dashboard?utm_source=github.com\\&utm_medium=referral\\&utm_content=tj-django/django-view-breadcrumbs\\&utm_campaign=Badge_Coverage) [![PyPI version](https://badge.fury.io/py/django-view-breadcrumbs.svg)](https://badge.fury.io/py/django-view-breadcrumbs)\n\n![PyPI - Django Version](https://img.shields.io/pypi/djversions/django-view-breadcrumbs) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/django-view-breadcrumbs)\n[![Downloads](https://static.pepy.tech/badge/django-view-breadcrumbs)](https://pepy.tech/project/django-view-breadcrumbs)\n\n<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->\n\n[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-)\n\n<!-- ALL-CONTRIBUTORS-BADGE:END -->\n\n## Table of Contents\n\n*   [Background](#background)\n*   [Installation](#installation)\n    *   [Add `view_breadcrumbs` to your INSTALLED\\_APPS](#add-view_breadcrumbs-to-your-installed_apps)\n*   [Breadcrumb mixin classes provided.](#breadcrumb-mixin-classes-provided)\n*   [Settings](#settings)\n    *   [Customization](#customization)\n        *   [BREADCRUMBS\\_TEMPLATE](#breadcrumbs_template)\n            *   [Site wide](#site-wide)\n            *   [Overriding the breadcrumb template for a single view](#overriding-the-breadcrumb-template-for-a-single-view)\n        *   [BREADCRUMBS\\_HOME\\_LABEL](#breadcrumbs_home_label)\n            *   [Site wide](#site-wide-1)\n            *   [Overriding the Home label for a specific view](#overriding-the-home-label-for-a-specific-view)\n*   [Translation support](#translation-support)\n    *   [Example](#example)\n*   [Usage](#usage)\n    *   [View Configuration](#view-configuration)\n        *   [django-tables-2](#django-tables-2)\n    *   [URL Configuration](#url-configuration)\n    *   [Examples](#examples)\n        *   [Sample crumbs: `Posts`](#sample-crumbs-posts)\n        *   [Sample crumbs:  `Home / Posts / Test - Post`](#sample-crumbs--home--posts--test---post)\n        *   [Custom crumbs: `Home / My Test Breadcrumb`](#custom-crumbs-home--my-test-breadcrumb)\n    *   [Using multiple apps](#using-multiple-apps)\n*   [Running locally](#running-locally)\n*   [Credits](#credits)\n*   [Contributors \u2728](#contributors-)\n\n## Background\n\nThis 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.\n\n<img width=\"1438\" alt=\"breadcrumbs\" src=\"https://user-images.githubusercontent.com/17484350/128493747-776706bf-d46c-4b57-ba54-c64fcc71ada7.png\">\n\nIn the `base.html` template add the `render_breadcrumbs` tag and any template that inherits the base should have breadcrumbs included.\n\n**Example:**\n\n    my_app\n       |--templates\n                |--base.html\n                |--create.html\n\n`base.html`\n\n```jinja2\n{% load view_breadcrumbs %}\n\n{% block breadcrumbs %}\n    {% render_breadcrumbs %} {# Optionally provide a custom template e.g {% render_breadcrumbs \"view_breadcrumbs/bootstrap5.html\" %} #}\n{% endblock %}\n```\n\nAnd your `create.html`.\n\n```jinja2\n{% extends \"base.html\" %}\n```\n\n## Installation\n\n```bash\n$ pip install django-view-breadcrumbs\n\n```\n\n### Add `view_breadcrumbs` to your INSTALLED\\_APPS\n\n```python\n\nINSTALLED_APPS = [\n    ...,\n    \"view_breadcrumbs\",\n    ...,\n]\n```\n\n## Breadcrumb mixin classes provided.\n\n*   `BaseBreadcrumbMixin`    - Subclasses requires a `crumbs` class property.\n*   `CreateBreadcrumbMixin`  - For create views `Home / Posts / Add Post`\n*   `DetailBreadcrumbMixin`  - For detail views `Home / Posts / Post 1`\n*   `ListBreadcrumbMixin`    - For list views `Home / Posts`\n*   `UpdateBreadcrumbMixin`  - For Update views `Home / Posts / Post 1 / Update Post 1`\n*   `DeleteBreadcrumbMixin`  - For Delete views this has a link to the list view to be used as the success URL.\n\n## Settings\n\n> NOTE :warning:\n>\n> *   Make sure that `\"django.template.context_processors.request\"` is added to your TEMPLATE OPTIONS setting.\n\n```python\nTEMPLATES  = [\n    {\n        \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n        \"APP_DIRS\": True,\n        \"OPTIONS\": {\n            \"context_processors\": [\n                \"django.template.context_processors.debug\",\n                \"django.template.context_processors.request\", # <- This context processor is required\n                \"django.contrib.auth.context_processors.auth\",\n                \"django.contrib.messages.context_processors.messages\",\n            ],\n        },\n    },\n]\n```\n\nModify the defaults using the following:\n\n| Name                       | Default                                     | Description |    Options          |\n|----------------------------|---------------------------------------------|-------------|---------------------|\n| `BREADCRUMBS_TEMPLATE`     | `\"view_breadcrumbs/bootstrap5.html\"`        |  Template used to render breadcrumbs.           |   [Predefined Templates](https://github.com/tj-django/django-view-breadcrumbs/tree/main/view_breadcrumbs/templates/view_breadcrumbs)                 |\n| `BREADCRUMBS_HOME_LABEL`   |  `Home`                                     |  Default label for the root path  |         |\n\n### Customization\n\n#### BREADCRUMBS\\_TEMPLATE\n\n##### Site wide\n\n```python\nBREADCRUMBS_TEMPLATE = \"my_app/breadcrumbs.html\"\n```\n\n##### Overriding the breadcrumb template for a single view\n\nUpdate the `base.html`\n\n```jinja2\n{% render_breadcrumbs \"my_app/breadcrumbs.html\" %}\n```\n\n#### BREADCRUMBS\\_HOME\\_LABEL\n\n##### Site wide\n\n```python\nBREADCRUMBS_HOME_LABEL = \"My new home\"\n```\n\n##### Overriding the Home label for a specific view\n\n```python\nfrom django.utils.translation import gettext_lazy as _\nfrom view_breadcrumbs import DetailBreadcrumbMixin\nfrom django.views.generic import DetailView\nfrom demo.models import TestModel\n\n\nclass TestDetailView(DetailBreadcrumbMixin, DetailView):\n     model = TestModel\n     home_label = _(\"My new home\")\n     template_name = \"demo/test-detail.html\"\n```\n\n*Renders*\n\n<img width=\"436\" alt=\"custom-root-breadcrumb\" src=\"https://user-images.githubusercontent.com/17484350/128493798-c71a8071-e913-4875-80b6-c7b414ac4e24.png\">\n\n## [Translation support](https://docs.djangoproject.com/en/3.1/topics/i18n/translation/)\n\n### Example\n\n![translated-crumbs](https://user-images.githubusercontent.com/17484350/128493830-7e50a6a9-3648-48cb-b198-4646ee2b03cf.png)\n\n## Usage\n\n`django-view-breadcrumbs` includes generic mixins that can be added to a class based view.\n\nUsing the generic breadcrumb mixin each breadcrumb will be added to the view dynamically\nand can be overridden by providing a `crumbs` property.\n\n### View Configuration\n\n> NOTE: :warning:\n>\n> *   Model based views should use a pattern `view_name=model_verbose_name_{action}`\n\n|  Actions  |  View Class |  View name  | Sample Breadcrumb | Example  |\n|-----------|-------------|-------------|-------------------|----------|\n| `list`    | [`ListView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-display/#listview)  | `{model.verbose_name}_list` |  `Home / Posts`  |  [Posts Example](https://github.com/tj-django/django-view-breadcrumbs#sample-crumbs-posts) |\n| `create`  | [`CreateView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-editing/#createview) | `{model.verbose_name}_create` | `Home / Posts / Add Post` |  |\n| `detail`  | [`DetailView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-display/#detailview) | `{model.verbose_name}_detail` | `Home / Posts / Test - Post` |  |\n| `change`  | [`UpdateView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-editing/#updateview) | `{model.verbose_name}_update` | `Home / Posts / Test - Post / Update Test - Post` |  |\n| `delete`  | [`DeleteView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-editing/#deleteview) | `{model.verbose_name}_delete` | N/A |\n|   N/A     | [`TemplateView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/base/#templateview) | N/A  | N/A |  See: [Custom View](#custom-crumbs-home--my-test-breadcrumb) |\n|   N/A     | [`FormView`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-editing/#formview) | N/A  | N/A |  See: [Custom View](#custom-crumbs-home--my-test-breadcrumb) |\n|   N/A     | [`AboutView`](https://docs.djangoproject.com/en/3.2/topics/class-based-views/#subclassing-generic-views) | N/A  | N/A |  See: [Custom View](#custom-crumbs-home--my-test-breadcrumb) |\n|   N/A     | [`View`](https://docs.djangoproject.com/en/3.2/ref/class-based-views/base/#view) | N/A  | N/A |  See: [Custom View](#custom-crumbs-home--my-test-breadcrumb) |\n\n#### [django-tables-2](https://django-tables2.readthedocs.io/en/latest/index.html#)\n\n|  Actions  |  View Class |  View name  | Sample Breadcrumb | Example  |\n|-----------|-------------|-------------|-------------------|----------|\n|   N/A     | [`SingleTableMixin`](https://django-tables2.readthedocs.io/en/latest/pages/generic-mixins.html?highlight=SingleTableMixin#a-single-table-using-singletablemixin) | N/A  | N/A |  See: [demo table view](https://github.com/tj-django/django-view-breadcrumbs/blob/main/demo/views.py#L154-L162) |\n|   N/A     | [`MultiTableMixin`](https://django-tables2.readthedocs.io/en/latest/pages/generic-mixins.html?highlight=SingleTableMixin#multiple-tables-using-multitablemixin) | N/A  | N/A |  See: [demo table view](https://github.com/tj-django/django-view-breadcrumbs/blob/main/demo/views.py#L166-L173) |\n|   N/A     | [`SingleTableView`](https://django-tables2.readthedocs.io/en/latest/pages/api-reference.html?highlight=SingleTableView#singletableview) | N/A  | N/A |  Same implementation as `SingleTableMixin` |\n\nFor more examples see: [demo app](https://github.com/tj-django/django-view-breadcrumbs/tree/main/demo)\n\n### URL Configuration\n\nBased 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.\n\nThis can be manually entered in your `urls.py` or you can optionally use the following class properties instead of hardcoding the `view_name`.\n\n```python\n...\n    path(\"tests/\", TestListsView.as_view(), name=TestListsView.list_view_name),\n    path(\n        \"tests/<slug:slug>/\",\n        TestDetailView.as_view(),\n        name=TestDetailView.detail_view_name,\n    ),\n    path(\n        \"tests/<slug:slug>/update/\",\n        TestUpdateView.as_view(),\n        name=TestUpdateView.update_view_name,\n    ),\n    path(\n        \"tests/<slug:slug>/delete/\",\n        TestDeleteView.as_view(),\n        name=TestDeleteView.delete_view_name,\n    ),\n...\n```\n\n### Examples\n\n#### Sample crumbs: `Posts`\n\nIn your urls.py\n\n```python\n  urlpatterns = [\n      ...\n      path(\"posts/\", views.PostList.as_view(), name=\"post_list\"),\n      ...\n      # OR\n      ...\n      path(\"posts/\", views.PostList.as_view(), name=views.PostList.list_view_name),\n      ...\n  ]\n```\n\n> All crumbs use the home root path `/` as the base this can be excluded by specifying `add_home = False`\n\n```python\nfrom django.views.generic import ListView\nfrom view_breadcrumbs import ListBreadcrumbMixin\n\n\nclass PostList(ListBreadcrumbMixin, ListView):\n    model = Post\n    template_name = \"app/post/list.html\"\n    add_home = False\n```\n\n#### Sample crumbs:  `Home / Posts / Test - Post`\n\nIn your `urls.py`\n\n```python\n  urlpatterns = [\n      ...\n      path(\"posts/<slug:slug>/\", views.PostDetail.as_view(), name=\"post_detail\"),\n      ...\n      # OR\n      ...\n      path(\"posts/<slug:slug>/\", views.PostDetail.as_view(), name=views.PostDetail.detail_view_name),\n      ...\n  ]\n\n```\n\n`views.py`\n\n```python\nfrom django.views.generic import DetailView\nfrom view_breadcrumbs import DetailBreadcrumbMixin\n\n\nclass PostDetail(DetailBreadcrumbMixin, DetailView):\n    model = Post\n    template_name = \"app/post/detail.html\"\n    breadcrumb_use_pk = False\n```\n\n#### Custom crumbs: `Home / My Test Breadcrumb`\n\nURL configuration.\n\n```python\n    urlpatterns = [\n       path(\"my-custom-view/\", views.CustomView.as_view(), name=\"custom_view\"),\n    ]\n```\n\nviews.py\n\n```python\nfrom django.urls import reverse\nfrom django.views.generic import View\nfrom view_breadcrumbs import BaseBreadcrumbMixin\nfrom demo.models import TestModel\n\n\nclass CustomView(BaseBreadcrumbMixin, View):\n    model = TestModel\n    template_name = \"app/test/custom.html\"\n    crumbs = [(\"My Test Breadcrumb\", reverse(\"custom_view\"))]  # OR reverse_lazy\n```\n\n**OR**\n\n```python\nfrom django.urls import reverse\nfrom django.views.generic import View\nfrom view_breadcrumbs import BaseBreadcrumbMixin\nfrom demo.models import TestModel\nfrom django.utils.functional import cached_property\n\n\nclass CustomView(BaseBreadcrumbMixin, View):\n    template_name = \"app/test/custom.html\"\n\n    @cached_property\n    def crumbs(self):\n        return [(\"My Test Breadcrumb\", reverse(\"custom_view\"))]\n\n```\n\n> Refer to the [demo app](https://github.com/tj-django/django-view-breadcrumbs/tree/main/demo) for more examples.\n\n### Using multiple apps\n\nTo reference models from a different application you need to override the `app_name` class attribute.\n\nExample:\nUsing a `Library` model that is imported from a `custom` application that you want to render in a `demo` app view.\n\n```python\nINSTALLED_APPS =  [\n    ...\n    \"demo\",\n    \"custom\",\n    ...\n]\n```\n\n`demo/views.py`\n\n```python\nclass LibraryDetailView(DetailBreadcrumbMixin, DetailView):\n    model = Library\n    app_name = \"demo\"\n    ...\n```\n\n## Running locally\n\n```bash\n$ git clone git@github.com:tj-django/django-view-breadcrumbs.git\n$ make install-dev\n$ make migrate\n$ make run\n```\n\nSpins up a django server running the demo app.\n\nVisit `http://127.0.0.1:8090`\n\n## Credits\n\n*   [django-bootstrap-breadcrumbs](https://github.com/prymitive/bootstrap-breadcrumbs)\n\nTo file a bug or submit a patch, please head over to [django-view-breadcrumbs on github](https://github.com/tj-django/django-view-breadcrumbs/issues).\n\nIf you feel generous and want to show some extra appreciation:\n\nSupport me with a :star:\n\n[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee]\n\n[buymeacoffee]: https://www.buymeacoffee.com/jackton1\n\n[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png\n\n## Contributors \u2728\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n\n<!-- prettier-ignore-start -->\n\n<!-- markdownlint-disable -->\n\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://fansourcedpoisontour.com\"><img src=\"https://avatars3.githubusercontent.com/u/1037197?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Derek</b></sub></a><br /><a href=\"https://github.com/tj-django/django-view-breadcrumbs/commits?author=KrunchMuffin\" title=\"Documentation\">\ud83d\udcd6</a></td>\n    <td align=\"center\"><a href=\"http://www.emencia.com\"><img src=\"https://avatars.githubusercontent.com/u/1572165?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>David THENON</b></sub></a><br /><a href=\"https://github.com/tj-django/django-view-breadcrumbs/commits?author=sveetch\" title=\"Code\">\ud83d\udcbb</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "Django generic view breadcrumbs",
    "version": "2.5.1",
    "project_urls": {
        "Homepage": "https://github.com/tj-django/django-view-breadcrumbs"
    },
    "split_keywords": [
        "django breadcrumbs",
        "breadcrumbs",
        "django generic views breadcrumb"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "95c971dd2ed51e24a236b8267ddfa1ab2863647468f7a720aaa6151c336057a5",
                "md5": "93ffc257283a05d8030c43d804526216",
                "sha256": "0405af06d416c661edfea8d0b5023b37ec016edfb9ce8646c6b4a39127d48620"
            },
            "downloads": -1,
            "filename": "django_view_breadcrumbs-2.5.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "93ffc257283a05d8030c43d804526216",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 25774,
            "upload_time": "2023-11-07T01:28:11",
            "upload_time_iso_8601": "2023-11-07T01:28:11.289785Z",
            "url": "https://files.pythonhosted.org/packages/95/c9/71dd2ed51e24a236b8267ddfa1ab2863647468f7a720aaa6151c336057a5/django_view_breadcrumbs-2.5.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a79625123c58f6f4a5dc207f285a0c0ddaad106792b603bdd7687e2dedc39ea5",
                "md5": "12f024a8c1409ae6c716ad21931ae4ad",
                "sha256": "b214c3758f6159d1ad8d76a21e7430a9f208be52fc79ba021e13a2ee675dbb3b"
            },
            "downloads": -1,
            "filename": "django-view-breadcrumbs-2.5.1.tar.gz",
            "has_sig": false,
            "md5_digest": "12f024a8c1409ae6c716ad21931ae4ad",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 47740,
            "upload_time": "2023-11-07T01:28:13",
            "upload_time_iso_8601": "2023-11-07T01:28:13.412774Z",
            "url": "https://files.pythonhosted.org/packages/a7/96/25123c58f6f4a5dc207f285a0c0ddaad106792b603bdd7687e2dedc39ea5/django-view-breadcrumbs-2.5.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-11-07 01:28:13",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "tj-django",
    "github_project": "django-view-breadcrumbs",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "django-view-breadcrumbs"
}
        
Elapsed time: 0.29960s