From 3fce0d2a9162cf6e749a6de0b18890dea8955e89 Mon Sep 17 00:00:00 2001
From: Simon Meers <simon@simonmeers.com>
Date: Mon, 20 Aug 2012 16:47:30 +1000
Subject: [PATCH] Fixed #18063 -- Avoid unicode in Model.__repr__ in python 2

Thanks guettli and mrmachine.
---
 django/db/models/base.py                     |  2 ++
 tests/regressiontests/model_regress/tests.py | 10 ++++++++++
 2 files changed, 12 insertions(+)

diff --git a/django/db/models/base.py b/django/db/models/base.py
index fd7250cdb0..d7a9932388 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -404,6 +404,8 @@ class Model(six.with_metaclass(ModelBase, object)):
             u = six.text_type(self)
         except (UnicodeEncodeError, UnicodeDecodeError):
             u = '[Bad Unicode data]'
+        if not six.PY3:
+            u = u.encode('ascii', 'replace')
         return smart_str('<%s: %s>' % (self.__class__.__name__, u))
 
     def __str__(self):
diff --git a/tests/regressiontests/model_regress/tests.py b/tests/regressiontests/model_regress/tests.py
index 6a45a83052..6a03b861e4 100644
--- a/tests/regressiontests/model_regress/tests.py
+++ b/tests/regressiontests/model_regress/tests.py
@@ -1,3 +1,5 @@
+# coding: utf-8
+
 from __future__ import absolute_import, unicode_literals
 
 import datetime
@@ -146,6 +148,14 @@ class ModelTests(TestCase):
         b = BrokenUnicodeMethod.objects.create(name="Jerry")
         self.assertEqual(repr(b), "<BrokenUnicodeMethod: [Bad Unicode data]>")
 
+    def test_no_unicode_in_repr(self):
+        a = Article.objects.create(
+            headline="Watch for umlauts: üöä", pub_date=datetime.datetime.now())
+        if six.PY3:
+            self.assertEqual(repr(a), '<Article: Watch for umlauts: üöä>')
+        else:
+            self.assertEqual(repr(a), '<Article: Watch for umlauts: ???>')
+
     @skipUnlessDBFeature("supports_timezones")
     def test_timezones(self):
         # Saving an updating with timezone-aware datetime Python objects.