django-multiselectfield (0.1.13)
Installation
pip install --index-url django-multiselectfieldAbout this package
Django multiple select field
django-multiselectfield
.. image:: https://travis-ci.org/goinnn/django-multiselectfield.png?branch=master :target: https://travis-ci.org/goinnn/django-multiselectfield
.. image:: https://coveralls.io/repos/goinnn/django-multiselectfield/badge.png?branch=master :target: https://coveralls.io/r/goinnn/django-multiselectfield
.. image:: https://badge.fury.io/py/django-multiselectfield.png :target: https://badge.fury.io/py/django-multiselectfield
A new model field and form field. With this you can get a multiple select from a choices. Stores to the database as a CharField of comma-separated values.
This egg is inspired by this snippet <http://djangosnippets.org/snippets/1200/>_.
Supported Python versions: 2.7, 3.4+
Supported Django versions: 1.4-2.0+
Installation
Install with pip
.. code-block:: bash
$ pip install django-multiselectfield
Configure your models.py
.. code-block:: python
from multiselectfield import MultiSelectField
# ...
MY_CHOICES = (('item_key1', 'Item title 1.1'),
('item_key2', 'Item title 1.2'),
('item_key3', 'Item title 1.3'),
('item_key4', 'Item title 1.4'),
('item_key5', 'Item title 1.5'))
MY_CHOICES2 = ((1, 'Item title 2.1'),
(2, 'Item title 2.2'),
(3, 'Item title 2.3'),
(4, 'Item title 2.4'),
(5, 'Item title 2.5'))
class MyModel(models.Model):
# .....
my_field = MultiSelectField(choices=MY_CHOICES)
my_field2 = MultiSelectField(choices=MY_CHOICES2,
max_choices=3,
max_length=3)
In your settings.py
Only you need it, if you want the translation of django-multiselectfield
.. code-block:: python
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
#.....................#
'multiselectfield',
)
Customizing templates
It is possible to customize the HTML of this widget in your form template. To do so, you will need to loop through form.{field}.field.choices. Here is an example that displays the field label underneath/after the checkbox for a MultiSelectField called providers:
.. code-block:: HTML+Django
{% for value, text in form.providers.field.choices %}
<div class="ui slider checkbox">
<input id="id_providers_{{ forloop.counter0 }}" name="{{ form.providers.name }}" type="checkbox" value="{{ value }}"{% if value in checked_providers %} checked="checked"{% endif %}>
<label>{{ text }}</label>
</div>
{% endfor %}
Django REST Framework
Django REST Framework comes with a MultipleChoiceField that works perfectly with this:
.. code-block:: python
from rest_framework import fields, serializers
from myapp.models import MY_CHOICES, MY_CHOICES2
class MyModelSerializer(serializers.HyperlinkedModelSerializer):
# ...
my_field = fields.MultipleChoiceField(choices=MY_CHOICES)
my_field2 = fields.MultipleChoiceField(choices=MY_CHOICES2)
# ...
Known Bugs and Limitations
All tests pass on Django 1.4, 1.5, and 1.8+, so if you can, use a modern version of Django. However, if you must use Django 1.6 or 1.7 there are two known issues you will need to be aware of:
-
Named groups <https://github.com/goinnn/django-multiselectfield/pull/30#issue-52149983>_ do not render properly in Django 1.6. The workaround is to manually render the field in your form or use a custom widget. If your workaround is suitably generic, please submit a pull request with it. -
Only in Django 1.6 and 1.7, due to
Django bug #9619 <https://code.djangoproject.com/ticket/9619>_, passing a MultiSelectField tovalues()orvalues_list()will return the database representation of the field (a string of comma-separated values). The workaround is to manually call.split(',')on the result.The Django bug was introduced in Django 1.6 and is fixed in Django 1.8 and onward, so
values()andvalues_list()return a vanilla Python list of values for Django <= 1.5 and Django >= 1.8.See
issue #40 <https://github.com/goinnn/django-multiselectfield/issues/40>_ for discussion about this bug.
Development
You can get the last bleeding edge version of django-multiselectfield by doing a clone of its git repository:
.. code-block:: bash
git clone https://github.com/goinnn/django-multiselectfield
Example project
There is a fully configured example project in the example directory <https://github.com/goinnn/django-multiselectfield/tree/master/example/>_. You can run it as usual:
.. code-block:: bash
python manage.py migrate # or python manage.py syncdb --noinput
python manage.py loaddata app_data
python manage.py runserver
Changelog
0.1.13 (2024-06-30)
- Return MSFList instead of a plain list from form fields (
#118 <https://github.com/goinnn/django-multiselectfield/pull/118>,#135 <https://github.com/goinnn/django-multiselectfield/pull/135>) - Fix CI (
#122 <https://github.com/goinnn/django-multiselectfield/pull/122>,#147 <https://github.com/goinnn/django-multiselectfield/pull/147>,#148 <https://github.com/goinnn/django-multiselectfield/pull/148>,#151 <https://github.com/goinnn/django-multiselectfield/pull/151>) - Add
min_choicesto defaults when converting to form field (#123 <https://github.com/goinnn/django-multiselectfield/pull/123>_) - Django 5.0 support and remove old compatibility (
#148 <https://github.com/goinnn/django-multiselectfield/pull/148>_)
Thanks to:
tomasgarzon <https://github.com/tomasgarzon>_aleh-rymasheuski <https://github.com/aleh-rymasheuski>_nametkin <https://github.com/nametkin>_karolyi <https://github.com/karolyi>_olivierdalang <https://github.com/olivierdalang>_PetrDlouhy <https://github.com/PetrDlouhy>_
0.1.12 (2020-02-20)
- Optimize multiselectfield to_python method
- Thanks to:
daimon99 <https://github.com/daimon99>_
0.1.11 (2019-12-19)
- Added support for Django 3
- Added support for Python 3.8
- Thanks to:
thijsBoehme <https://github.com/thijsBoehme>_
0.1.9 (2019-10-02)
- Added support for Django 2
- Added support for Python 3.6
- Drop support for Python (2.6, 3.3)
- Thanks to:
hirokinko <https://github.com/hirokinko>_
0.1.6 (2017-05-10)
- Added support for Django 1.11
- Added support for Python 3.6
- Improved rendering in Django admin
- Improved documentation
- Thanks to:
atten <https://github.com/atten>_ixc <https://github.comixc>_LeilaniAnn <https://github.comLeilaniAnn>_
0.1.5 (2017-01-02)
- Added support for Django 1.8-1.10
- Added support for named groups in choices
- Added support for min_choices argument
- Various fixes
- More tests
- Thanks to:
danilogbotelho <https://github.comdanilogbotelho>_dmitry-krasilnikov <https://github.comdmitry-krasilnikov>_Kamil Dębowski <https://github.comkdebowski>_
0.1.4 (2016-02-23)
- Fixed warning about SubfieldBase
- Added support for Django 1.8+
- Added support for named groups
- We now play nice with django-dynamic-fixture
- More tests
0.1.3 (2014-10-13)
- Support to Django 1.7 (I'm sorry to the delay)
- Adding get_FIELD_list function
- Fix an error when a MultiSelectField was reandonly at the admin site
- Thanks to:
Hernil <https://github.com/hernil>_Vasyl Stanislavchuk <https://github.com/vasyabigi>_Litchfield <https://github.com/litchfield/>_Chris-erickson <https://github.com/chris-erickson>_
0.1.2 (2014-04-04)
- Include the spanish translations to the pypi egg
- Improvements in the readme file
- Windows OS compatibility
- Thanks to:
StillNewb <https://github.com/StillNewb>_Diego Yungh <https://github.com/DiegoYungh>_
0.1.1 (2013-12-04)
- Move the multiselectfield app to parent folder
- Details
0.1.0 (2013-11-30)
- Test/example project
- Now works if the first composant of the list of tuple is an integer
- Now max_length is not required, the Multiselect field calculate it automatically.
- The max_choices attr can be a attr in the model field
- Refactor the code
- Spanish translations
- Support to python2.6
- Thanks to:
Daniele Procida <https://github.com/evildmp>_
0.0.3 (2013-09-11)
- Python 3 compatible
- Fix an error, the snippet had another error when the choices were translatables
- Improvements in the README file
0.0.2 (2012-09-28)
- Fix an error, the snippet had an error.
0.0.1 (2012-09-27)
- Initial version from the next
snippet <http://djangosnippets.org/snippets/1200/>_