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
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
pip install dalf
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
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']
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
- Ehco - Contributor
- Bahattin Çiniç - Bug Report!
- Nguyễn Hồng Quân - Contributor
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 -r requirements-dev.txt
pip install -e /path/to/dalf
pre-commit install
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 test # Run tests
rake upload:main # Upload package to main distro (release)
rake upload:test # Upload package to test distro
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
DALFModelAdmin
without overriding default assets - Bahattin
2024-08-16
- Add
gettextSafe
function 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.
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.