Skip to content

Instantly share code, notes, and snippets.

@victoraguilarc
Created March 28, 2025 19:39
Show Gist options
  • Save victoraguilarc/373eafd451c949f0ea4c39e3619f4cb8 to your computer and use it in GitHub Desktop.
Save victoraguilarc/373eafd451c949f0ea4c39e3619f4cb8 to your computer and use it in GitHub Desktop.
multiselect widget
# -*- coding: utf-8 -*-
from django.contrib.admin.filters import (
AllValuesFieldListFilter,
ChoicesFieldListFilter,
RelatedFieldListFilter,
RelatedOnlyFieldListFilter,
SimpleListFilter,
)
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.utils.datastructures import MultiValueDict
class ArrayFieldSelectMultiple(FilteredSelectMultiple):
"""Overrides the regular widget for arrays by the another pretty awesome."""
def __init__(
self,
verbose_name,
is_stacked=False,
*args,
**kwargs,
): # noqa: D107
self.delimiter = kwargs.pop('delimiter', ',')
super().__init__(verbose_name, is_stacked, *args, **kwargs)
def render(self, name, value, attrs=None, renderer=None): # noqa: D102
if isinstance(value, str):
value = value.split(self.delimiter)
return super().render(name, value, attrs, renderer)
def value_from_datadict(self, options_data, files, name): # noqa: D107, D102
if isinstance(options_data, MultiValueDict):
# Normally, we'd want a list here, which is what we get from the
# SelectMultiple superclass, but the SimpleArrayField expects to
# get a delimited string, so we're doing a little extra work.
return self.delimiter.join(options_data.getlist(name))
return options_data.get(name, None)
class SimpleDropdownFilter(SimpleListFilter):
template = 'admin/dropdown_filter.html'
class DropdownFilter(AllValuesFieldListFilter):
template = 'admin/dropdown_filter.html'
class ChoiceDropdownFilter(ChoicesFieldListFilter):
template = 'admin/dropdown_filter.html'
class RelatedDropdownFilter(RelatedFieldListFilter):
template = 'admin/dropdown_filter.html'
class RelatedOnlyDropdownFilter(RelatedOnlyFieldListFilter):
template = 'admin/dropdown_filter.html'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment