diff options
author | Aymeric Augustin <aymeric.augustin@m4x.org> | 2012-11-27 09:45:37 +0100 |
---|---|---|
committer | Aymeric Augustin <aymeric.augustin@m4x.org> | 2012-11-27 09:55:26 +0100 |
commit | 71e5ad248e104f68a0d755cd5f76e86631607be5 (patch) | |
tree | 452f34c84d2e89ee67f226e7c46fb9aa8fd59517 | |
parent | 7c91b67cfaf4669df55a715e62d891faea796f20 (diff) | |
download | django-71e5ad248e104f68a0d755cd5f76e86631607be5.tar.gz |
[1.5.x] Fixed #19362 -- Detected invalid use of @python_2_unicode_compatible.
Thanks m3wolf for the report and akaariai for reproducing the problem.
Backport of 2ea80b9.
-rw-r--r-- | django/db/models/base.py | 5 | ||||
-rw-r--r-- | tests/modeltests/str/models.py | 8 | ||||
-rw-r--r-- | tests/modeltests/str/tests.py | 12 |
3 files changed, 24 insertions, 1 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py index a1f9e2f26e..bf9854d289 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -416,6 +416,11 @@ class Model(six.with_metaclass(ModelBase, object)): 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__ diff --git a/tests/modeltests/str/models.py b/tests/modeltests/str/models.py index 488012e861..1c158ea008 100644 --- a/tests/modeltests/str/models.py +++ b/tests/modeltests/str/models.py @@ -28,6 +28,14 @@ class Article(models.Model): 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) pub_date = models.DateTimeField() diff --git a/tests/modeltests/str/tests.py b/tests/modeltests/str/tests.py index 2c11ac8c78..31869583aa 100644 --- a/tests/modeltests/str/tests.py +++ b/tests/modeltests/str/tests.py @@ -7,7 +7,7 @@ from django.test import TestCase 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 @@ class SimpleTests(TestCase): 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', |