Created
March 28, 2025 19:39
-
-
Save victoraguilarc/373eafd451c949f0ea4c39e3619f4cb8 to your computer and use it in GitHub Desktop.
multiselect widget
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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