Dead simple autocompletion for Django admin list_filter with goodies.
Project description
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
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
]
Usage
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']
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ç - Bug Report!
Contribute
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!
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
2024-07-14
- Fix choice.display last element issue
2024-07-03
- Now package is working fine :) Thanks to Bahattin!
2024-06-01
- Update missing information in the README
- Improve github action triggers
2024-05-23
- Add tests
- Add GitHub actions (test, ruff linter)
- Add pre-commit hooks
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
Built Distribution
File details
Details for the file dalf-0.2.1.tar.gz
.
File metadata
- Download URL: dalf-0.2.1.tar.gz
- Upload date:
- Size: 11.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37eae77b7be322e397d8d9d1608960ccd53885fac5d44ae1fb985b334dde7a6e |
|
MD5 | 31488f3c713e19fd7177f5710fce3b1d |
|
BLAKE2b-256 | 3cfe0ecd2278cfc36a370072fd2658157bd7b5f4827af15032d4855c9142c236 |
File details
Details for the file dalf-0.2.1-py3-none-any.whl
.
File metadata
- Download URL: dalf-0.2.1-py3-none-any.whl
- Upload date:
- Size: 9.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bb28decf6b3f67341059ebbf6fbe4c403e4af9cfe2b60e5f3cb176342cc93b76 |
|
MD5 | 960144ac495ae93e66387cd5f816674f |
|
BLAKE2b-256 | 8e3d82e0b711d03ea35ea4a267befc6a4045fa2106e3c6e5583adaaefc922a19 |