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
After Django Admin List Filter
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
]
Use DALFModelAdmin
, inherited from admin.ModelAdmin
to inject media urls only.
You have some filters;
DALFRelatedField
: inherited fromadmin.RelatedFieldListFilter
.DALFRelatedFieldAjax
: inherited fromadmin.RelatedFieldListFilter
DALFRelatedOnlyField
: inherited fromadmin.RelatedOnlyFieldListFilter
.DALFChoicesField
: inherited fromadmin.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!
)
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!
- Uğur Özyılmazel - Creator, maintainer
All PR’s are welcome!
fork
(https://github.com/vigo/django-admin-list-filter/fork)- Create your
branch
(git checkout -b my-feature
) commit
yours (git commit -am 'add some functionality'
)push
yourbranch
(git push origin my-feature
)- 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!
Clone the repo somewhere, and install with:
pip install -e /path/to/django-admin-list-filter
And play with the filters :)
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
2024-05-20
- Initial release.
You can read the whole story here.
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.