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:
Johannes Hoppe 2015-11-23 11:50:45 +01:00
parent 0457617738
commit 19a8d63bb1
3 changed files with 38 additions and 12 deletions

View file

@ -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

View file

@ -9,4 +9,4 @@ The app includes Select2 driven Django Widgets and Form Fields.
"""
__version__ = "5.3.1"
__version__ = "5.4.0"

View file

@ -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 = []