Permalink
Browse files

[1.5.x] Fixed #19362 -- Detected invalid use of @python_2_unicode_com…

…patible.

Thanks m3wolf for the report and akaariai for reproducing the problem.

Backport of 2ea80b9.
  • Loading branch information...
1 parent 7c91b67 commit 71e5ad248e104f68a0d755cd5f76e86631607be5 @aaugustin aaugustin committed Nov 27, 2012
Showing with 24 additions and 1 deletion.
  1. +5 −0 django/db/models/base.py
  2. +8 −0 tests/modeltests/str/models.py
  3. +11 −1 tests/modeltests/str/tests.py
View
@@ -416,6 +416,11 @@ def __repr__(self):
def __str__(self):
if not six.PY3 and hasattr(self, '__unicode__'):
+ if type(self).__unicode__ == Model.__str__:
+ klass_name = type(self).__name__
+ raise RuntimeError("%s.__unicode__ is aliased to __str__. Did"
+ " you apply @python_2_unicode_compatible"
+ " without defining __str__?" % klass_name)
return force_text(self).encode('utf-8')
return '%s object' % self.__class__.__name__
@@ -27,6 +27,14 @@ def __str__(self):
# in ASCII.
return self.headline
+@python_2_unicode_compatible
+class BrokenArticle(models.Model):
+ headline = models.CharField(max_length=100)
+ pub_date = models.DateTimeField()
+
+ def __unicode__(self): # instead of __str__
+ return self.headline
+
@python_2_unicode_compatible
class InternationalArticle(models.Model):
headline = models.CharField(max_length=100)
@@ -7,7 +7,7 @@
from django.utils import six
from django.utils.unittest import skipIf
-from .models import Article, InternationalArticle
+from .models import Article, BrokenArticle, InternationalArticle
class SimpleTests(TestCase):
@@ -21,6 +21,16 @@ def test_basic(self):
self.assertEqual(str(a), str('Area man programs in Python'))
self.assertEqual(repr(a), str('<Article: Area man programs in Python>'))
+ @skipIf(six.PY3, "tests Model's default __str__ method under Python 2")
+ def test_broken(self):
+ # Regression test for #19362.
+ a = BrokenArticle.objects.create(
+ headline='Girl wins €12.500 in lottery',
+ pub_date=datetime.datetime(2005, 7, 28)
+ )
+ self.assertRaisesRegexp(RuntimeError, "Did you apply "
+ "@python_2_unicode_compatible without defining __str__\?", str, a)
+
def test_international(self):
a = InternationalArticle.objects.create(
headline='Girl wins €12.500 in lottery',

0 comments on commit 71e5ad2

Please sign in to comment.