Skip to main content

Object moderation layer for Django models

Project description

OML means Object Moderation Layer — a mixin model that lets you add content moderation (pending / accepted / rejected states) to any Django model.

Installation

pip install django-oml

Add 'oml' to INSTALLED_APPS and run migrate.

Configuration

Add an OML_CONFIG dictionary to your Django settings:

OML_CONFIG = {
    # Set True to let certain groups bypass moderation
    'OML_EXCLUDE_MODERATED': True,

    # List of group IDs that skip the moderation queue
    'OML_EXCLUDED_GROUPS': [],
}

Usage

Inherit from ModeratedModel:

from oml.models import ModeratedModel

class Article(ModeratedModel):
    title = models.CharField(max_length=200)

The model gains:

  • status field ('p' pending / 'a' accepted / 'r' rejected)

  • authorized_by FK to the user who last moderated the object

  • status_date DateTimeField of the last moderation action

  • .objects.accepted(), .pending(), .rejected() queryset shortcuts

  • .accept(user) and .reject(user) methods

Admin integration

Use ModelAdminOml to get moderation features out of the box:

from oml.models import ModelAdminOml

@admin.register(Article)
class ArticleAdmin(ModelAdminOml):
    pass

This gives you automatically:

  • status, authorized_by, and status_date columns in the changelist

  • A Status filter in the sidebar

  • Accept selected and Reject selected bulk actions

Moderation panel

A cross-model panel that lists all pending items across every ModeratedModel subclass in your project.

  1. Include the OML URLs in your project’s urls.py:

    from django.urls import include, path
    
    urlpatterns = [
        ...
        path('admin/oml/', include('oml.urls')),
    ]
  2. Visit /admin/oml/moderation/. The panel is restricted to staff users.

The panel supports:

  • Filtering by content type via ?ct_filter=<model_name>

  • Per-item Approve / Edit / Reject actions

  • Bulk approve via checkbox selection

  • Pagination (50 items per page)

Template tag

The panel is rendered via an inclusion tag you can embed in your own templates:

{% load oml_tags %}
{% get_content_for_approval request %}

This renders admin/oml/pending_content.html, which you can override in your project’s template directory.

Running the tests

pip install pytest pytest-django
pytest

Compatibility

  • Python 3.10, 3.11, 3.12, 3.13, 3.14

  • Django 4.2 (LTS), 5.1, 5.2 (LTS), 6.0

Why did we revamp this?

The original django-oml was written in 2013 and last released in 2015. It was archived on GitHub in 2023 with no forks and no active successors.

The codebase still worked conceptually, but it had accumulated a decade of bit-rot: Python 2-only idioms (ugettext_lazy, __unicode__, MIDDLEWARE_CLASSES), missing on_delete arguments that Django 2.0 made mandatory, a silent bug in the group-exclusion logic that made the feature completely non-functional, and a test suite built on abandoned tools (nose, django-nose). None of it would import cleanly on a modern Django project.

Rather than throw it away and start over — or accept that content moderation simply has no maintained, lightweight option in the Django ecosystem — we chose to modernize it in place. The logic was sound; it just needed to catch up with ten years of Django evolution.

Alternatives

These are the other packages that cover similar ground. We looked at all of them before deciding to revamp django-oml.

Package

Last release

Status

django-moderation

April 2022

Unmaintained. Supports up to Django 3.2.

django-moderation-model-mixin

November 2021

Unmaintained. No Django 4+ support.

django-gatekeeper

2009

Abandoned.

As of June 2026, no actively maintained package provides a simple mixin-based moderation layer compatible with Django 4.2+. django-oml 0.1.0 fills that gap. Django 6.1 support will be added once it reaches a stable release.

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_oml-0.1.1.tar.gz (12.0 kB view details)

Uploaded Source

Built Distribution

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

django_oml-0.1.1-py3-none-any.whl (14.1 kB view details)

Uploaded Python 3

File details

Details for the file django_oml-0.1.1.tar.gz.

File metadata

  • Download URL: django_oml-0.1.1.tar.gz
  • Upload date:
  • Size: 12.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for django_oml-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1b326dc27f11a53420d8aa5720f29d84000c983c974ba839008387ace13747c3
MD5 f9b9b8186c06e704ab814ca916a6a8fc
BLAKE2b-256 da2de087fbb87faa3ef2afe918469d7bc4a92955651fac77824acebbf51f5bab

See more details on using hashes here.

File details

Details for the file django_oml-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: django_oml-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 14.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for django_oml-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e943a6b762956dc8bd5531611134562a3fc766dcecb6d3f2e7c782065caf98d3
MD5 f6eccbf9f7ad9bce11dcfe2563927e09
BLAKE2b-256 4c55f0f752d05f6b9c908f137d94fb52353d3fff4a5acba496c9678048b5712a

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