parent
a6a12d7392
commit
f943fe07f5
|
@ -92,7 +92,7 @@ class Select2Mixin(object):
|
|||
|
||||
def render_options(self, *args, **kwargs):
|
||||
"""Render options including an empty one, if the field is not required."""
|
||||
output = '<option></option>' if not self.is_required else ''
|
||||
output = '<option></option>' if not self.is_required and not self.allow_multiple_selected else ''
|
||||
output += super(Select2Mixin, self).render_options(*args, **kwargs)
|
||||
return output
|
||||
|
||||
|
@ -248,7 +248,7 @@ class HeavySelect2Mixin(object):
|
|||
choices = chain(self.choices, choices)
|
||||
else:
|
||||
choices = self.choices
|
||||
output = ['<option></option>' if not self.is_required else '']
|
||||
output = ['<option></option>' if not self.is_required and not self.allow_multiple_selected else '']
|
||||
selected_choices = {force_text(v) for v in selected_choices}
|
||||
choices = {(k, v) for k, v in choices if force_text(k) in selected_choices}
|
||||
for option_value, option_label in choices:
|
||||
|
@ -412,7 +412,7 @@ class ModelSelect2Mixin(object):
|
|||
else:
|
||||
choices = self.choices
|
||||
selected_choices = {force_text(v) for v in selected_choices}
|
||||
output = ['<option></option>' if not self.is_required else '']
|
||||
output = ['<option></option>' if not self.is_required and not self.allow_multiple_selected else '']
|
||||
if isinstance(self.choices, ModelChoiceIterator):
|
||||
if not self.queryset:
|
||||
self.queryset = self.choices.queryset
|
||||
|
|
|
@ -27,6 +27,7 @@ from tests.testapp.models import Genre
|
|||
class TestSelect2Mixin(object):
|
||||
url = reverse('select2_widget')
|
||||
form = forms.AlbumSelect2WidgetForm()
|
||||
multiple_form = forms.AlbumSelect2MultipleWidgetForm()
|
||||
widget_cls = Select2Widget
|
||||
|
||||
def test_initial_data(self, genres):
|
||||
|
@ -82,6 +83,18 @@ class TestSelect2Mixin(object):
|
|||
widget = HeavySelect2Widget(data_url='/foo/bar')
|
||||
assert widget.get_url() == '/foo/bar'
|
||||
|
||||
def test_empty_option(self, db):
|
||||
# Empty options is only required for single selects
|
||||
# https://select2.github.io/options.html#allowClear
|
||||
single_select = self.form.fields['primary_genre']
|
||||
assert single_select.required is False
|
||||
assert '<option></option>' in single_select.widget.render('primary_genre', None)
|
||||
|
||||
multiple_select = self.multiple_form.fields['featured_artists']
|
||||
assert multiple_select.required is False
|
||||
assert multiple_select.widget.allow_multiple_selected
|
||||
assert '<option></option>' not in multiple_select.widget.render('featured_artists', None)
|
||||
|
||||
|
||||
class TestSelect2MixinSettings(object):
|
||||
def test_default_media(self):
|
||||
|
@ -170,6 +183,7 @@ class TestHeavySelect2Mixin(TestSelect2Mixin):
|
|||
|
||||
class TestModelSelect2Mixin(TestHeavySelect2Mixin):
|
||||
form = forms.AlbumModelSelect2WidgetForm(initial={'primary_genre': 1})
|
||||
multiple_form = forms.ArtistModelSelect2MultipleWidgetForm()
|
||||
|
||||
def test_initial_data(self, genres):
|
||||
genre = genres[0]
|
||||
|
|
|
@ -117,7 +117,12 @@ class ArtistModelSelect2MultipleWidgetForm(forms.Form):
|
|||
genres = forms.ModelMultipleChoiceField(widget=ModelSelect2MultipleWidget(
|
||||
queryset=models.Genre.objects.all(),
|
||||
search_fields=['title__icontains'],
|
||||
), queryset=models.Genre.objects.all(), required=False)
|
||||
), queryset=models.Genre.objects.all(), required=True)
|
||||
|
||||
featured_artists = forms.ModelMultipleChoiceField(widget=ModelSelect2MultipleWidget(
|
||||
queryset=models.Artist.objects.all(),
|
||||
search_fields=['title__icontains'],
|
||||
), queryset=models.Artist.objects.all(), required=False)
|
||||
|
||||
NUMBER_CHOICES = [
|
||||
(1, 'One'),
|
||||
|
|
Loading…
Reference in New Issue