All Articles Kinsa Creative

Adding a Sortable Column to a Models List View in the Django Admin

To create a sortable column that is based on a method in the Django admin change list, utilize the attribute admin_order_field and set it to a dunder delineated database traversal of an attribute to sort on:

def get_accepted(self, obj):
    return obj.accepted

# utilize the Admin's checkbox icon to indicate True as a visual indica
get_accepted.boolean = True
# sort by "obj.accepted"
get_accepted.admin_order_field = 'accepted'


list_display = [..., 'get_accepted', ...]

A more complicated, and slightly more complete example:

from django.contrib import admin
from django.urls import reverse 
from django.utils.html import format_html

class MyModelAdmin(admin.ModelAdmin):
    def get_project(self, obj):
        if obj.project:
            url = reverse('admin:myapp_project_change', args=[])
            return format_html(f'{}')
        return '-'

    # sort by ""
    get_project.admin_order_field = 'project__name'


    list_display = [..., 'get_project', ...]

The Django documentation mentions this functionality in passing as "custom display functions".


Email us at