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
After Django Admin List Filter
2024-07-03
Thanks to my dear friend Bahattin Çiniç’s warning, He realized
that the necessary HTML, CSS, and JavaScript files were missing from the
published package! I quickly fixed this and published a new version. The 0.1.0
version is a faulty version. I apologize to the users for this confusion.
Thank you. - vigo
Installation
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 fromadmin.RelatedFieldListFilter.DALFRelatedFieldAjax: inherited fromadmin.RelatedFieldListFilterDALFRelatedOnlyField: 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 from YOURAPP.models import Post @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 django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.models import User from dalf.admin import ( DALFModelAdmin, DALFChoicesField, DALFRelatedOnlyField, DALFRelatedFieldAjax, ) from YOURAPP.models import Post, Category, Tag # must be registered, must have search_fields, required for `author` field demo. # this is demo purpose only, you can register/import your own/custom User model class UserAdmin(BaseUserAdmin): search_fields = ['username'] ordering = ['username'] admin.site.unregister(User) admin.site.register(User, UserAdmin) @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! ) # must be registered, must have search_fields @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): search_fields = ['title',] ordering = ['title'] # must be registered, must have search_fields @admin.register(Tag) class TagAdmin(admin.ModelAdmin): search_fields = ['name',] ordering = ['name']
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)
- Uğur Özyılmazel - Creator, maintainer
- Ehco - Contributor
- Bahattin Çiniç - Contributor
- Nguyễn Hồng Quân - Contributor
- Stanislav Terliakov - Contributor
Contribute
All PR’s are welcome!
fork(https://github.com/vigo/django-admin-list-filter/fork)- Create your
branch(git checkout -b my-feature) commityours (git commit -am 'add some functionality')pushyourbranch(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!
Development
Clone the repo somewhere, and install with:
pip install -r requirements-dev.txt pip install -e /path/to/dalf pre-commit install
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 test # Run tests rake upload:main # Upload package to main distro (release) rake upload:test # Upload package to test distro
Change Log
2025-10-06
- Fix nested FK problem, thanks to penenkel
2025-03-14
- Fix ForeignKey relation to
__idissue. Stanislav Terliakov
2024-11-07
- Fix dark-mode ajax autocompletion colors - Nguyễn Hồng Quân
2024-09-06
- Fix dark-mode text color.
2024-08-25
- Fix extend media in
DALFModelAdminwithout overriding default assets - Bahattin
2024-08-16
- Add
gettextSafefunction to handle missing gettext in Django - Bahattin
2024-07-14
- Fix choice.display last element issue
2024-07-03
- Now package is working fine :) Thanks to Bahattin!
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.

