39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
from django import forms
|
|
|
|
|
|
class MultiSelectWidget(forms.MultiWidget):
|
|
template_name = 'combo/widgets/multiselectwidget.html'
|
|
|
|
class Media:
|
|
js = ('js/combo.multiselectwidget.js',)
|
|
css = {'all': ('css/combo.multiselectwidget.css',)}
|
|
|
|
def __init__(self, attrs=None):
|
|
self.attrs = attrs
|
|
widgets = [forms.Select(attrs=attrs)]
|
|
super().__init__(widgets, attrs)
|
|
|
|
def get_context(self, name, value, attrs):
|
|
if not isinstance(value, list):
|
|
value = [value]
|
|
|
|
self.widgets = []
|
|
for _ in range(max(len(value), 1)):
|
|
self.widgets.append(forms.Select(attrs=self.attrs, choices=self.choices))
|
|
|
|
# all subwidgets must have the same name
|
|
self.widgets_names = [''] * len(self.widgets)
|
|
return super().get_context(name, value, attrs)
|
|
|
|
def decompress(self, value):
|
|
return value or []
|
|
|
|
def value_from_datadict(self, data, files, name):
|
|
values = [x for x in data.getlist(name) if x]
|
|
|
|
# remove duplicates while keeping order
|
|
return list(dict.fromkeys(values))
|
|
|
|
def id_for_label(self, id_):
|
|
return id_
|