Skip to main content

Dead simple autocompletion for Django admin list_filter with goodies.

Project description

Version Python Django Ruff PyPI version PyPI - Downloads Codecov

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


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 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
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)


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 -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-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

dalf-0.2.0.tar.gz (11.8 kB view details)

Uploaded Source

Built Distribution

dalf-0.2.0-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: dalf-0.2.0.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

Hashes for dalf-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b8678fd44142022d3e1636e5b8f9ff13b8c673587b81f0f5e062873470029dae
MD5 eab66f2c9dd4692eb6f53eeedd9a4b6f
BLAKE2b-256 4ac41b15964b3a00b6ab2911dbf08dd48a280de086691c6381b434c88f20403c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dalf-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.2

File hashes

Hashes for dalf-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a8cd3ccb17f60ffa8d1014e4da35de179a52ff6d844892be0f69bbcc18b29168
MD5 45cb1eecd7732c9f54790c35c2787f9e
BLAKE2b-256 3a471a729cb933866e12dd47f91db444cc65692f4766f0cf9559f12a29ba564e

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