Skip to main content

Django admin list filter with goodies

Project description

Version Python Django Ruff

Django Admin List Filter

Dead simple autocompletion for Django admin list_filter. This was made using the libraries shipped with Django (select2, jquery), Django’s built-in list filters, and Django’s built-in AutocompleteJsonView.

This package is an improved version of the previously created django-admin-autocomplete-list-filter package. It supports Django version 5 and above. Please note that the django-admin-autocomplete-list-filter package is now deprecated. Since I am no longer part of the organization where it was initially developed, I cannot archive it.

No extra package or install required!

Before Django Admin List Filter

Before Django Admin List Filter

After Django Admin List Filter

After Django Admin List Filter


Installation

pip install django-admin-list-filter

Add dalf to your INSTALLED_APPS in your settings.py:

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "dalf", # <- add
]

Usage

Use DALFModelAdmin, inherited from admin.ModelAdmin to inject media urls only. You have some filters;

  • DALFRelatedField: inherited from admin.RelatedFieldListFilter.
  • DALFRelatedFieldAjax: inherited from admin.RelatedFieldListFilter
  • DALFRelatedOnlyField: inherited from admin.RelatedOnlyFieldListFilter.
  • DALFChoicesField: inherited from admin.ChoicesFieldListFilter.

Example models.py

# models.py
import uuid

from django.conf import settings
from django.db import models


class Category(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=255)

    def __str__(self):
        return self.title


class Tag(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    category = models.ForeignKey(to='Category', on_delete=models.CASCADE, related_name='posts')
    author = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='posts')
    title = models.CharField(max_length=255)
    body = models.TextField()
    tags = models.ManyToManyField(to='Tag', blank=True)

    def __str__(self):
        return self.title

Example admin.py:

# admin.py
from dalf.admin import DALFModelAdmin, DALFRelatedOnlyField, DALFRelatedFieldAjax
from django.contrib import admin


@admin.register(Post)
class PostAdmin(DALFModelAdmin):
    list_filter = (
        ('author', DALFRelatedOnlyField),    # if author has a post!
        ('category', DALFRelatedFieldAjax),  # enable ajax completion for category field (FK)
        ('tags', DALFRelatedFieldAjax),      # enable ajax completion for tags field (M2M)
    )

That’s all... There is also DALFChoicesField, you can test it out:

# admin.py
from dalf.admin import DALFModelAdmin, DALFChoicesField, DALFRelatedOnlyField, DALFRelatedFieldAjax
from django.contrib import admin


@admin.register(Post)
class PostAdmin(DALFModelAdmin):
    list_filter = (
        ('author', DALFChoicesField),        # enable autocomplete w/o ajax (FK)
        ('category', DALFRelatedFieldAjax),  # enable ajax completion for category field (FK)
        ('tags', DALFRelatedOnlyField),      # enable ajax completion for tags field (M2M) if posts has any tag!
    )

Extras

I mostly use django-timezone-field, here is an illustration of timezone completion w/o ajax:

pip install django-timezone-field

Now add timezone field to Post model:

# modify models.py, add new ones
from timezone_field import TimeZoneField                 # <- add this line

class Post(models.Model):
    # all the other fiels
    timezone = TimeZoneField(default=settings.TIME_ZONE) # <- add this line
    
    # rest of the code

Now, just add timezone as regular list_filter:

# modify admin.py, add new ones

@admin.register(Post)
class PostAdmin(DALFModelAdmin):
    # previous codes
    list_filter = (
        # previous filters
        ('timezone', DALFChoicesField), # <- add this line
    )

That’s it!


Contributor(s)


Contribute

All PR’s are welcome!

  1. fork (https://github.com/vigo/django-admin-list-filter/fork)
  2. Create your branch (git checkout -b my-feature)
  3. commit yours (git commit -am 'add some functionality')
  4. push your branch (git push origin my-feature)
  5. Than create a new Pull Request!

I am not very proficient in JavaScript. Therefore, any support, suggestions, and feedback are welcome to help improve the project. Feel free to open pull requests!


Development

Clone the repo somewhere, and install with:

pip install -e /path/to/django-admin-list-filter

And play with the filters :)

Publish

Note to my self:

pip install build twine
rake -T

rake build           # Build package
rake bump[revision]  # Bump version: major,minor,patch
rake clean           # Remove/Delete build..
rake upload:main     # Upload package to main distro (release)
rake upload:test     # Upload package to test distro

Change Log

2024-05-20

  • Initial release.

You can read the whole story here.


License

This project is licensed under MIT


This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.

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

dalf-0.1.0.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

dalf-0.1.0-py3-none-any.whl (5.7 kB view details)

Uploaded Python 3

File details

Details for the file dalf-0.1.0.tar.gz.

File metadata

  • Download URL: dalf-0.1.0.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.0

File hashes

Hashes for dalf-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ee1ea3f8b2a7a1be596fdfc1f8a05075946e6a92ab7f832b8dd349ae9e595ba5
MD5 6518cd1b73292dfb0d7244cde70f1c67
BLAKE2b-256 5d267cd0c82d1e041d8a937c8d285b1d3b5d24e7c94bae44070b9754c8512b73

See more details on using hashes here.

File details

Details for the file dalf-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: dalf-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 5.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.0

File hashes

Hashes for dalf-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 837d2e4d1a87e744c46d109464bcef141d7bcbd770d26542ea8d2e46ef8a6b00
MD5 4a11ab660d84453646596a7749c0b346
BLAKE2b-256 98326f101c7095bf8afd43049ac7dfe15c67d9a133f6ccbdf6592e352c1e54aa

See more details on using hashes here.

Supported by

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