Skip to content

Commit 10d5e8d

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 10d5e8d

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
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+
"""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 & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from collections.abc import Iterable
44

55
import pytest
6-
from django.contrib.admin.widgets import SELECT2_TRANSLATIONS
76
from django.db.models import QuerySet
87
from django.urls import reverse
98
from django.utils import translation
@@ -48,11 +47,16 @@ def test_initial_form_class(self):
4847
assert "my-class" in widget.render("name", None)
4948
assert "django-select2" in widget.render("name", None)
5049

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)
50+
def test_lang_attr(self):
51+
with translation.override("de"):
52+
widget = Select2Widget()
53+
assert 'lang="de"' in widget.render("name", None)
54+
55+
# Regression test for #163
56+
widget = Select2Widget()
57+
assert widget.i18n_name == "en"
58+
with translation.override("de"):
59+
assert widget.i18n_name == "de"
5660

5761
def test_allow_clear(self, db):
5862
required_field = self.form.fields["artist"]
@@ -258,11 +262,10 @@ def test_initial_form_class(self):
258262
"name", None
259263
)
260264

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)
265+
def test_lang_attr(self):
266+
with translation.override("fr"):
267+
widget = self.widget_cls(data_view="heavy_data_1")
268+
assert 'lang="fr"' in widget.render("name", None)
266269

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

0 commit comments

Comments
 (0)