From ea3e40c278eb27fb3c8362d9e8cd67f957bf4f57 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Sat, 31 Jan 2015 16:05:16 +0100 Subject: [PATCH] [1.8.x] Fixed #24252 -- Forced lazy __str__ to utf-8 on Python 2 Thanks Stanislas Guerra for the report and Tomas Ehrlich for the review. Backport of cd0ceaa102 from master. --- django/utils/functional.py | 4 ++++ tests/urlpatterns_reverse/tests.py | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/django/utils/functional.py b/django/utils/functional.py index aa0d6f850a..37cc7c7f0f 100644 --- a/django/utils/functional.py +++ b/django/utils/functional.py @@ -120,6 +120,7 @@ def lazy(func, *resultclasses): cls.__str__ = cls.__text_cast else: cls.__unicode__ = cls.__text_cast + cls.__str__ = cls.__bytes_cast_encoded elif cls._delegate_bytes: if six.PY3: cls.__bytes__ = cls.__bytes_cast @@ -142,6 +143,9 @@ def lazy(func, *resultclasses): def __bytes_cast(self): return bytes(func(*self.__args, **self.__kw)) + def __bytes_cast_encoded(self): + return func(*self.__args, **self.__kw).encode('utf-8') + def __cast(self): if self._delegate_bytes: return self.__bytes_cast() diff --git a/tests/urlpatterns_reverse/tests.py b/tests/urlpatterns_reverse/tests.py index bb732d2fec..d2fa1a9825 100644 --- a/tests/urlpatterns_reverse/tests.py +++ b/tests/urlpatterns_reverse/tests.py @@ -318,6 +318,17 @@ class ReverseLazyTest(TestCase): response = self.client.get('/login_required_view/') self.assertEqual(response.status_code, 200) + def test_inserting_reverse_lazy_into_string(self): + self.assertEqual( + 'Some URL: %s' % reverse_lazy('some-login-page'), + 'Some URL: /login/' + ) + if six.PY2: + self.assertEqual( + b'Some URL: %s' % reverse_lazy('some-login-page'), + 'Some URL: /login/' + ) + class ReverseLazySettingsTest(AdminScriptTestCase): """