Skip to content

Latest commit

 

History

History
169 lines (125 loc) · 5.04 KB

README.rst

File metadata and controls

169 lines (125 loc) · 5.04 KB

Django Dynamic Filters

Package License Downloads Python Django

A django ModelAdmin Filter which adds advanced filtering abilities to the admin.

creating filters

Creating a filter

using filters

Apply a filter

Requirements

Installation & Set up

  1. Run pip install django-dynamic-filters to install dynfilters.

  2. Add "dynfilters" to your INSTALLED_APPS setting like this:

    INSTALLED_APPS = [
        ...
        'adminsortable2',
        'dynfilters',
    ]
    
  3. Add "dynfilters" URL to your urls.py file:

    urlpatterns = [
        ...
        path('dynfilters/', include('dynfilters.urls')),
    ]
    
  4. Run python manage.py migrate to create the dynfilters models.

  5. Run python manage.py collectstatic to install the dynfilters media.

Integration Example

models.py

class Address(models.Model):
    town = models.CharField(max_length=32)

class Person(models.Model):
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)
    birth_date = models.DateField()
    address = models.ForeignKey(Address, on_delete=models.CASCADE)

admin.py

from dynfilters.filters import DynamicFilter

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    ...
    list_filter = (DynamicFilter,)

    dynfilters_fields = [
        '-',
        'first_name',
        'last_name',
        ('first_name|last_name', 'Name'),   # Will generate: Q(first_name=<value>) | Q(last_name=<value>)
        ('birth_date', 'Date of birth'),    # Requires the value to be: DD/MM/YYYY
        '-',
        ('address__town', 'City'),
    ]

    dynfilters_select_related = ['address'] # Optional
    dynfilters_prefetch_related = []        # Optional

Operators & Lookups

The following operators and lookups are supported:

operators

OP_CHOICES = [
    ('-', '-'),
    ('!', 'NOT'),
    ('&', 'AND'),
    ('|', 'OR'),
    ('(', '('),
    (')', ')'),
]

lookups

LOOKUP_CHOICES = [
    ('-', '---------'),
    ('=', 'Equals'),
    ('icontains', 'Contains'),
    ('istartswith', 'Starts with'),
    ('iendswith', 'Ends with'),
    ('in', 'One of'),          # Requires the value to be: aaa,bbb,ccc
    ('-', '---------'),
    ('range', 'Date Range'),   # Requires the value to be: DD/MM/YYYY,DD/MM/YYYY
    ('year', 'Date Year'),
    ('month', 'Date Month'),
    ('day', 'Date Day'),
    ('-', '---------'),
    ('isnull', 'Is NULL'),
    ('isnotnull', 'Is not NULL'),
    ('istrue', 'Is TRUE'),
    ('isfalse', 'Is FALSE'),
    ('-', '---------'),
    ('lt', 'Less Than'),
    ('gt', 'Greater Than'),
    ('lte', 'Less Than or Equal To'),
    ('gte', 'Greater Than or Equal To'),
]

Sharing

There are two ways dynamic filters can be shared:

  1. By marking a filter global. The filter will be available to all admin users.
  2. By pressing the share icon. The filter can then be shared by email. When the recipients clicks on the received link, a copy of the filter will be created. The edits made to the copy will not affect the original filter.

Alternatives