mirror of
https://github.com/Hopiu/django-select2.git
synced 2026-04-30 18:04:43 +00:00
Refactors tag widgets and adds light tag widget
Currently there was no light version of the tag widget. A light version might come handy if you use a postgres `ArrayField` and a corresponding `SimpleArrayField`. Resolved #226
This commit is contained in:
parent
0457617738
commit
19a8d63bb1
3 changed files with 38 additions and 12 deletions
|
|
@ -1,6 +1,9 @@
|
|||
Changelog Summary
|
||||
=================
|
||||
|
||||
### v5.4.0
|
||||
* Added `Select2TagWidget` a light widget with tagging support
|
||||
|
||||
### v5.3.0
|
||||
* Added djangoSelect2 jQuery plugin to support
|
||||
dynamic field initialisation
|
||||
|
|
|
|||
|
|
@ -9,4 +9,4 @@ The app includes Select2 driven Django Widgets and Form Fields.
|
|||
|
||||
"""
|
||||
|
||||
__version__ = "5.3.1"
|
||||
__version__ = "5.4.0"
|
||||
|
|
|
|||
|
|
@ -109,6 +109,18 @@ class Select2Mixin(object):
|
|||
media = property(_get_media)
|
||||
|
||||
|
||||
class Select2TagMixin(object):
|
||||
|
||||
"""Mixin to add select2 tag functionality."""
|
||||
|
||||
def build_attrs(self, extra_attrs=None, **kwargs):
|
||||
"""Add select2's tag attributes."""
|
||||
self.attrs.setdefault('data-minimum-input-length', 1)
|
||||
self.attrs.setdefault('data-tags', 'true')
|
||||
self.attrs.setdefault('data-token-separators', [",", " "])
|
||||
return super(Select2TagMixin, self).build_attrs(extra_attrs, **kwargs)
|
||||
|
||||
|
||||
class Select2Widget(Select2Mixin, forms.Select):
|
||||
|
||||
"""
|
||||
|
|
@ -145,6 +157,24 @@ class Select2MultipleWidget(Select2Mixin, forms.SelectMultiple):
|
|||
pass
|
||||
|
||||
|
||||
class Select2TagWidget(Select2TagMixin, Select2Mixin, forms.SelectMultiple):
|
||||
|
||||
"""
|
||||
Select2 drop in widget for for tagging.
|
||||
|
||||
Example for :class:`.django.contrib.postgres.fields.ArrayField`::
|
||||
|
||||
class MyWidget(Select2TagWidget):
|
||||
|
||||
def value_from_datadict(self, data, files, name):
|
||||
values = super(MyWidget, self).value_from_datadict(data, files, name):
|
||||
return ",".join(values)
|
||||
|
||||
"""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
class HeavySelect2Mixin(Select2Mixin):
|
||||
|
||||
"""Mixin that adds select2's ajax options and registers itself on django's cache."""
|
||||
|
|
@ -242,16 +272,9 @@ class HeavySelect2MultipleWidget(HeavySelect2Mixin, forms.SelectMultiple):
|
|||
pass
|
||||
|
||||
|
||||
class HeavySelect2TagWidget(HeavySelect2MultipleWidget):
|
||||
class HeavySelect2TagWidget(Select2TagMixin, HeavySelect2MultipleWidget):
|
||||
|
||||
"""Mixin to add select2 tag functionality."""
|
||||
|
||||
def build_attrs(self, extra_attrs=None, **kwargs):
|
||||
"""Add select2's tag attributes."""
|
||||
self.attrs.setdefault('data-minimum-input-length', 1)
|
||||
self.attrs.setdefault('data-tags', 'true')
|
||||
self.attrs.setdefault('data-token-separators', [",", " "])
|
||||
return super(HeavySelect2TagWidget, self).build_attrs(extra_attrs, **kwargs)
|
||||
pass
|
||||
|
||||
|
||||
# Auto Heavy widgets
|
||||
|
|
@ -432,7 +455,7 @@ class ModelSelect2MultipleWidget(ModelSelect2Mixin, HeavySelect2MultipleWidget):
|
|||
pass
|
||||
|
||||
|
||||
class ModelSelect2TagWidget(ModelSelect2Mixin, HeavySelect2TagWidget):
|
||||
class ModelSelect2TagWidget(Select2TagMixin, ModelSelect2MultipleWidget):
|
||||
|
||||
"""
|
||||
Select2 model field with tag support.
|
||||
|
|
@ -447,7 +470,7 @@ class ModelSelect2TagWidget(ModelSelect2Mixin, HeavySelect2TagWidget):
|
|||
queryset = MyModel.objects.all()
|
||||
|
||||
def value_from_datadict(self, data, files, name):
|
||||
values = super().value_from_datadict(self, data, files, name):
|
||||
values = super().value_from_datadict(self, data, files, name)
|
||||
qs = self.queryset.filter(**{'pk__in': list(values)})
|
||||
pks = set(force_text(getattr(o, pk)) for o in qs)
|
||||
cleaned_values = []
|
||||
|
|
|
|||
Loading…
Reference in a new issue