Source code for easy_select2.utils

# coding: utf-8

from django.db.models import ForeignKey
from easy_select2 import forms as es2_forms
from easy_select2.widgets import Select2, Select2Mixin, Select2Multiple


# TODO: merge meta_fields and kwargs, which is the same.
[docs]def select2_modelform_meta(model, meta_fields=None, widgets=None, attrs=None, **kwargs): """ Return `Meta` class with Select2-enabled widgets for fields with choices (e.g. ForeignKey, CharField, etc) for use with ModelForm. Arguments: model - a model class to create `Meta` class for. meta_fields - dictionary with `Meta` class fields, for example, {'fields': ['id', 'name']} attrs - select2 widget attributes (width, for example), must be of type `dict`. **kwargs - will be merged with meta_fields. """ widgets = widgets or {} meta_fields = meta_fields or {} # TODO: assert attrs is of type `dict` for field in model._meta.fields: if isinstance(field, ForeignKey) or field.choices: widgets.update({field.name: Select2(select2attrs=attrs)}) for field in model._meta.many_to_many: widgets.update({field.name: Select2Multiple(select2attrs=attrs)}) meta_fields.update({ 'model': model, 'widgets': widgets, }) if 'exclude' not in kwargs and 'fields' not in kwargs: meta_fields.update({'exclude': []}) meta_fields.update(**kwargs) meta = type('Meta', (object,), meta_fields) return meta
[docs]def select2_modelform( model, attrs=None, form_class=es2_forms.FixedModelForm): """ Return ModelForm class for model with select2 widgets. Arguments: attrs: select2 widget attributes (width, for example) of type `dict`. form_class: modelform base class, `forms.ModelForm` by default. :: SomeModelForm = select2_modelform(models.SomeModelBanner) is the same like:: class SomeModelForm(forms.ModelForm): Meta = select2_modelform_meta(models.SomeModelForm) """ classname = '%sForm' % model._meta.object_name meta = select2_modelform_meta(model, attrs=attrs) return type(classname, (form_class,), {'Meta': meta})
[docs]def apply_select2(widget_cls): """ Dynamically create new widget class mixed with Select2Mixin. Args: widget_cls: class of source widget. Usage, for example:: class SomeModelForm(admin.ModelForm): class Meta: widgets = { 'field': apply_select2(forms.Select), } So, `apply_select2(forms.Select)` will return new class, named Select2Select. """ cname = 'Select2%s' % widget_cls.__name__ return type(cname, (Select2Mixin, widget_cls), {})