Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit dca7dbc

Browse files
Fix applegrew#565 -- Support empty_label on ModelSelect fields.
1 parent 8bd7f72 commit dca7dbc

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

‎django_select2/forms.py‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,16 @@ class Select2Mixin:
7070
form media.
7171
"""
7272

73+
empty_label = ''
74+
7375
def build_attrs(self, base_attrs, extra_attrs=None):
7476
"""Add select2 data attributes."""
7577
default_attrs = {'data-minimum-input-length': 0}
7678
if self.is_required:
7779
default_attrs['data-allow-clear'] = 'false'
7880
else:
7981
default_attrs['data-allow-clear'] = 'true'
80-
default_attrs['data-placeholder'] = ''
82+
default_attrs['data-placeholder'] = self.empty_label
8183

8284
default_attrs.update(base_attrs)
8385
attrs = super().build_attrs(default_attrs, extra_attrs=extra_attrs)
@@ -208,6 +210,7 @@ def __init__(self, attrs=None, choices=(), **kwargs):
208210
widget could be dependent on a country.
209211
Key is a name of a field in a form.
210212
Value is a name of a field in a model (used in `queryset`).
213+
211214
"""
212215
self.choices = choices
213216
if attrs is not None:
@@ -339,6 +342,12 @@ class ModelSelect2Mixin:
339342
max_results = 25
340343
"""Maximal results returned by :class:`.AutoResponseView`."""
341344

345+
@property
346+
def empty_label(self):
347+
if isinstance(self.choices, ModelChoiceIterator):
348+
return self.choices.field.empty_label
349+
return ''
350+
342351
def __init__(self, *args, **kwargs):
343352
"""
344353
Overwrite class parameters if passed as keyword arguments.

‎tests/conftest.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def random_name(n):
2121
@pytest.yield_fixture(scope='session')
2222
def driver():
2323
chrome_options = webdriver.ChromeOptions()
24-
chrome_options.headless = False
24+
chrome_options.headless = True
2525
try:
2626
b = webdriver.Chrome(options=chrome_options)
2727
except WebDriverException as e:

‎tests/test_forms.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,14 @@ def test_custom_to_field_name(self):
412412
form = forms.GroupieForm(instance=groupie)
413413
assert '<option value="Take That" selected>TAKE THAT</option>' in form.as_p()
414414

415+
def test_empty_label(self, db):
416+
# Empty options is only required for single selects
417+
# https://select2.github.io/options.html#allowClear
418+
single_select = self.form.fields['primary_genre']
419+
single_select.empty_label = 'Hello World'
420+
assert single_select.required is False
421+
assert 'data-placeholder="Hello World"' in single_select.widget.render('primary_genre', None)
422+
415423

416424
class TestHeavySelect2TagWidget(TestHeavySelect2Mixin):
417425

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /