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


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.4.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

dalf-0.2.4-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: dalf-0.2.4.tar.gz
  • Upload date:
  • Size: 12.1 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.4.tar.gz
Algorithm Hash digest
SHA256 bc6ad5022fb9a9344ea7370d1683a9f8585064048012069d4002ed8fca178d31
MD5 f4c1ddbbed3277f84ad53cfb4c49e61d
BLAKE2b-256 66904b62f7fe1d1f6f6442a3da99579c2eb956a90da0580d5979d8010c5a9548

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dalf-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 9.7 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.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6276061d747d7ea75fbfa426f1a1374dfa5e0bbe5cdb8fa042c5d66f22f569d2
MD5 22a8192c9d0d04441c785fe888a6d09f
BLAKE2b-256 25b196e13c5134daffe58432e1b99d04dee0b2d24aa4c6ef5f76ea9a890d9370

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