Skip to content

Commit 04ee445

Browse files
committed
Fix #163 -- Lazily get i18n locale name
A widget instance can leak the i18n setting to another request or be stuck on the default language setting.
1 parent 5894b52 commit 04ee445

File tree

2 files changed

+18
-13
lines changed

2 files changed

+18
-13
lines changed

django_select2/forms.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,10 @@ class Select2Mixin:
8686

8787
empty_label = ""
8888

89-
def __init__(self, *args, **kwargs):
90-
super().__init__(*args, **kwargs)
91-
self.i18n_name = SELECT2_TRANSLATIONS.get(get_language())
89+
@property
90+
def i18n_name(self):
91+
"""The name of the i18n file for the current language."""
92+
return SELECT2_TRANSLATIONS.get(get_language())
9293

9394
def build_attrs(self, base_attrs, extra_attrs=None):
9495
"""Add select2 data attributes."""

tests/test_forms.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,16 @@ def test_initial_form_class(self):
4848
assert "my-class" in widget.render("name", None)
4949
assert "django-select2" in widget.render("name", None)
5050

51-
@pytest.mark.parametrize("code,name", SELECT2_TRANSLATIONS.items())
52-
def test_lang_attr(self, code, name):
53-
translation.activate(code)
54-
widget = self.widget_cls()
55-
assert f'lang="{name}"' in widget.render("name", None)
51+
def test_lang_attr(self):
52+
with translation.override('de'):
53+
widget = Select2Widget()
54+
assert f'lang="de"' in widget.render("name", None)
55+
56+
# Regression test for #163
57+
widget = Select2Widget()
58+
assert widget.i18n_name == "en"
59+
with translation.override("de"):
60+
assert widget.i18n_name == "de"
5661

5762
def test_allow_clear(self, db):
5863
required_field = self.form.fields["artist"]
@@ -258,11 +263,10 @@ def test_initial_form_class(self):
258263
"name", None
259264
)
260265

261-
@pytest.mark.parametrize("code,name", SELECT2_TRANSLATIONS.items())
262-
def test_lang_attr(self, code, name):
263-
translation.activate(code)
264-
widget = self.widget_cls(data_view="heavy_data_1")
265-
assert f'lang="{name}"' in widget.render("name", None)
266+
def test_lang_attr(self):
267+
with translation.override('fr'):
268+
widget = self.widget_cls(data_view="heavy_data_1")
269+
assert f'lang="fr"' in widget.render("name", None)
266270

267271
def test_selected_option(self, db):
268272
not_required_field = self.form.fields["primary_genre"]

0 commit comments

Comments
 (0)