Skip to main content

django-hashtag PyPi license

PyPi status PyPi version PyPi python version PyPi downloads PyPi downloads PyPi downloads

GitHub GitHub release GitHub release

Test codecov.io pre-commit.ci status gitthub.com

Docs

Check Demo Project

  • Check the demo repo on GitHub

Requirements

  • Python 3.9, 3.10, 3.11, 3.12, 3.13, 3.14 supported.
  • Django 3.2, 4.2 and 5.2 supported.

We highly recommend and only officially support the latest patch release of each Python and Django series.

Setup

  1. Install from pip:
pip install django-hashtag
  1. Modify settings.py by adding the app to INSTALLED_APPS:
INSTALLED_APPS = [
    # ...
    "taggit",
    "hashtag",
    # ...
]
  1. Execute Django's command migrate inside your project's root:
python manage.py migrate
Running migrations:
  Applying hashtag.0001_initial... OK
  Applying hashtag.0002_alter_mytag_slug... OK
  Applying hashtag.0003_alter_mytag_last_used... OK

Usage

django-hashtag provides the tag data model plus reusable, consumer-agnostic helpers so every site renders and filters tags the same way without re-implementing the markup or the queryset logic.

Render tags as chips (hashtag_chips)

The hashtag_chips inclusion tag renders a tag collection as accessible chips. It accepts model instances (exposing name/slug/get_absolute_url) or plain strings.

{% load hashtag_tags %}

{# Static, non-linkable chips (e.g. a homepage badge row) #}
{% hashtag_chips tags variant="home" linkable=False %}

{# In-context filter links: builds <filter_url>?<filter_param>=<slug> #}
{% hashtag_chips tags variant="review" filter_url=request.path filter_param="tag" %}

{# Custom href pattern with a {slug} placeholder #}
{% hashtag_chips tags href_pattern="/reviews/?tag={slug}" %}

Arguments:

Argument Default Description
tags Iterable of tag instances or strings.
variant "" Theme modifier; adds hashtag-chips--<variant> / hashtag-chip--<variant>.
linkable True When False, render <span> chips instead of links.
prefix "#" Text prefix shown before each tag name.
filter_url "" Build an in-context filter link <filter_url>?<filter_param>=<slug>.
filter_param "tag" Query parameter used with filter_url.
href_pattern "" Link template with a {slug} placeholder.
link_class "" Extra CSS class added to each link.
channel "tag" Value for the data-channel attribute (analytics hook).
placement "" Value for the data-placement attribute (analytics hook).
label "" Accessible aria-label for the chip list.

Href resolution order: filter_url -> href_pattern -> get_absolute_url() (when reversible) -> none (renders a <span>).

Style the chips per site via CSS custom properties on the shared classes (hashtag-chip, hashtag-chip--<variant>); a base stylesheet ships at hashtag/static/hashtag/hashtag-chips.css.

Filter a list by tag

hashtag.filtering shares the queryset filter and active-tag lookup used by in-context list views, without referencing any consumer model:

from hashtag.filtering import active_tag_slug, filter_queryset_by_tag

def review_list(request):
    slug = active_tag_slug(request)            # reads ?tag=<slug>
    reviews = filter_queryset_by_tag(Review.objects.all(), slug)
    # ...build your own context/template/pagination...

filter_queryset_by_tag accepts a lookup argument (default "tags__slug") for non-default relation paths; an empty slug returns the queryset unchanged.

Optional canonical tag page (HASHTAG_TAG_URL_NAME)

MyTag.get_absolute_url() is configurable via HASHTAG_TAG_URL_NAME, which defaults to "tagged" for backward compatibility. Set it to "" to disable canonical tag pages:

# Enable canonical per-tag URLs resolved with reverse(name, args=[slug]).
HASHTAG_TAG_URL_NAME = "tagged"

# Or disable canonical tag pages entirely (sites that surface tags only as an
# in-context ?tag= filter); get_absolute_url() then raises NoReverseMatch and
# hashtag_chips falls back to filter_url/href_pattern.
HASHTAG_TAG_URL_NAME = ""

Run Example Project

git clone --depth=50 --branch=django-hashtag https://github.com/DLRSP/example.git DLRSP/example
cd DLRSP/example
python manage.py runserver

Now browser the app @ http://127.0.0.1:8000

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_hashtag-0.4.5.tar.gz (27.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_hashtag-0.4.5-py3-none-any.whl (22.3 kB view details)

Uploaded Python 3

File details

Details for the file django_hashtag-0.4.5.tar.gz.

File metadata

  • Download URL: django_hashtag-0.4.5.tar.gz
  • Upload date:
  • Size: 27.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for django_hashtag-0.4.5.tar.gz
Algorithm Hash digest
SHA256 ee2242000dac06ba208a1c164e59980501e2a74f64b2d388438bbf931ce67bbf
MD5 0743a5cb18b9ec189a742a79dbcda96e
BLAKE2b-256 56a1d9193b733a72cea267a16807df79da4ba98d2adc2e1b30b86f3e9b0c6594

See more details on using hashes here.

File details

Details for the file django_hashtag-0.4.5-py3-none-any.whl.

File metadata

  • Download URL: django_hashtag-0.4.5-py3-none-any.whl
  • Upload date:
  • Size: 22.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for django_hashtag-0.4.5-py3-none-any.whl
Algorithm Hash digest
SHA256 3bd009abf2e2733cc55aec158c07c317c72c59c509c8df0d6af447c3fffbd188
MD5 3a420a5a7b8c6a254f47f819d3eff251
BLAKE2b-256 dc63a6b7d86152dd1717966abe9ce0774ae965133ef735f00153424d73c9bf07

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.4.5 This release

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.2

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page