django-admin-sortable2

2.3.1 · active · verified Sat Apr 11

django-admin-sortable2 is a Django package that provides generic drag-and-drop ordering functionality for objects in the List, Stacked-Inline, and Tabular-Inline Views of the Django Admin interface. It enriches existing `ModelAdmin` and `InlineModelAdmin` classes with sortable behavior via mixins. The library is actively maintained, with frequent minor and patch releases to support newer Django and Python versions.

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to make both a main ModelAdmin list view and its associated inline forms sortable. It requires adding `adminsortable2` to `INSTALLED_APPS`, defining a positive integer `order` field (with `default=0` and in `Meta.ordering`) in your models, and then applying `SortableAdminMixin` to your `ModelAdmin` and `SortableTabularInline` (or `SortableStackedInline`) to your inline admin classes. Remember to run `makemigrations` and `migrate` after defining your models.

import os

# settings.py
# INSTALLED_APPS = [
#     ...,
#     'adminsortable2',
#     'your_app_name',
# ]

# your_app_name/models.py
from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=100)
    order = models.PositiveIntegerField(default=0, blank=False, null=False, db_index=True)

    class Meta:
        ordering = ['order']
        verbose_name_plural = 'Categories'

    def __str__(self):
        return self.name

class Item(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    order = models.PositiveIntegerField(default=0, blank=False, null=False, db_index=True)

    class Meta:
        ordering = ['order']

    def __str__(self):
        return self.name

# your_app_name/admin.py
from django.contrib import admin
from adminsortable2.admin import SortableAdminMixin, SortableTabularInline
from .models import Category, Item

class ItemInline(SortableTabularInline):
    model = Item
    extra = 1
    fields = ['name', 'order'] # 'order' can be omitted from 'fields' to be hidden

@admin.register(Category)
class CategoryAdmin(SortableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'order']
    inlines = [ItemInline]

# To run the example (after creating a Django project):
# 1. Add 'adminsortable2' and 'your_app_name' to INSTALLED_APPS in settings.py.
# 2. Run: python manage.py makemigrations your_app_name
# 3. Run: python manage.py migrate
# 4. Run: python manage.py createsuperuser
# 5. Run: python manage.py runserver
# 6. Access /admin/ and navigate to 'Categories' to test sorting.

view raw JSON →