Skip to main content

Admin announcements for Django (with optional django-unfold integration)

Project description

django-admin-announcements

PyPI - Version Build

Admin announcements for Django, with optional django-unfold layout integration.

Status: Testing. Alpha Release.

Features

  • Displays a list of active announcements above the Django admin header as a banner.
  • Allows admins to create announcements in the standard Django admin for editors (is_staff)
  • Announcements can be assigned to groups and are time- and date-sensitive
  • Allows editors to dismiss active announcements (stored in localStorage under djangoAdminAnnouncements)
  • Supports optional Markdown content if installed with markdown support (only for rendered HTML, no special fields)
  • Supports django-unfold using an optional contrib.unfold app
  • Supports django-unfold-modal to display announcements in a modal instead of a full page
  • Customize implementation via template tag admin_announcements_banner
  • Supports installed admin themes, custom colors, and dark mode.

Requirements

  • Python 3.10+
  • Django 5.0+
  • (Optional) django-unfold 0.52.0+ for the contrib.unfold integration

Markdown support

  • If installed with markdown support, announcements can contain Markdown and will be rendered as HTML.
  • nh3 is used to sanitize HTML and prevent XSS.
  • concrete.css (3kb) is used for Markdown styling.

Screenshots

Django admin Django admin detail
Django admin announcements banner Django admin announcement detail
Unfold admin Unfold admin detail
Unfold admin announcements banner Unfold admin announcement detail

Installation

pip install django-admin-announcements

Install with Markdown rendering support:

pip install "django-admin-announcements[markdown]"

Install with Markdown, Unfold, and Unfold Modal support:

pip install "django-admin-announcements[markdown,unfold,unfold-modal]"

Add to INSTALLED_APPS:

INSTALLED_APPS = [
    # ...
    "admin_announcements",
    "django.contrib.admin",
    # ...
]

For Unfold integration, also add the contrib app:

INSTALLED_APPS = [
    "admin_announcements.contrib.unfold",
    "unfold",
    "unfold_modal",  # Optional: enables modal announcement detail links.
    "admin_announcements",
    "django.contrib.admin",
    # ...
]

Keep admin_announcements.contrib.unfold before unfold so its Unfold-aware admin template override is discovered first.

To open announcement detail links in an Unfold modal, also install the unfold-modal extra and load django-unfold-modal assets in your Unfold settings:

uv sync --extra unfold --extra unfold-modal --group test --group dev
from unfold_modal.utils import get_modal_scripts, get_modal_styles

UNFOLD = {
    # ...
    "STYLES": [*get_modal_styles()],
    "SCRIPTS": [*get_modal_scripts()],
}

Without django-unfold-modal scripts, the links fall back to normal detail pages.

Custom template integration

If your project already overrides the default Django admin or Unfold templates, add the announcement assets and template tag to your custom template.

For the stock Django admin, extend your custom admin/base_site.html like this:

{% extends "admin/base_site.html" %}
{% load admin_announcements static %}

{% block extrastyle %}
{{ block.super }}
<link rel="stylesheet" href="{% static 'admin_announcements/css/announcements.css' %}">
{% endblock %}

{% block extrahead %}
{{ block.super }}
<script src="{% static 'admin_announcements/js/announcements.js' %}"></script>
{% endblock %}

{% block header %}
{% admin_announcements_banner %}
{{ block.super }}
{% endblock %}

For Unfold, load the assets through UNFOLD settings instead of template blocks. If you are not using django-unfold-modal, omit the modal imports and the *get_modal_*() entries.

from django.templatetags.static import static
from unfold_modal.utils import get_modal_scripts, get_modal_styles

UNFOLD = {
    # ...
    "STYLES": [
        lambda request: static("admin_announcements/css/announcements.css"),
        *get_modal_styles(),
    ],
    "SCRIPTS": [
        lambda request: static("admin_announcements/js/announcements.js"),
        *get_modal_scripts(),
    ],
}

Then render the banner inside a .unfold container so it inherits Unfold layout spacing and color variables:

{% extends "admin/base.html" %}
{% load admin_announcements %}

{% block content %}
{% if not is_popup %}
    <div class="unfold">
        {% admin_announcements_banner %}
    </div>
{% endif %}
{{ block.super }}
{% endblock %}

Run migrations:

python manage.py migrate admin_announcements

Local Development

Install dependencies:

uv sync --group test --group dev
npm ci

Install pre-commit hooks:

uv run pre-commit install

Run all pre-commit hooks manually:

uv run pre-commit run --all-files

Run the stock Django test server:

uv run tests/server/manage.py runserver 8080

Run the Unfold test server:

uv run --extra unfold tests/server/manage.py runserver 8080 --settings=testapp.settings_unfold

License

MIT

Project details


Download files

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

Source Distribution

django_admin_announcements-0.1.0b0.tar.gz (1.0 MB view details)

Uploaded Source

Built Distribution

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

django_admin_announcements-0.1.0b0-py3-none-any.whl (21.7 kB view details)

Uploaded Python 3

File details

Details for the file django_admin_announcements-0.1.0b0.tar.gz.

File metadata

File hashes

Hashes for django_admin_announcements-0.1.0b0.tar.gz
Algorithm Hash digest
SHA256 25c5af9d30c14dbeb5fff08e99388e2477f171609c75d023b89dcee8e8aae7ef
MD5 b3f865b71a943f1246ddb3f583262f7e
BLAKE2b-256 a8e1179d9973313326dd4a58b437778fc280912e8cec4563b78cc38957110182

See more details on using hashes here.

File details

Details for the file django_admin_announcements-0.1.0b0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_admin_announcements-0.1.0b0-py3-none-any.whl
Algorithm Hash digest
SHA256 2ffab6c071613f729d9ba6f3f3ccc01610c354815c33f45b54d2bdc7bc757a46
MD5 efefc8392ce068eefbf720cef29160c4
BLAKE2b-256 eb2281aabdcd33daac0460654232e1dace0cb092447da3970008f4300195f658

See more details on using hashes here.

Supported by

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