diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 4763940c81..29de8c7422 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -565,6 +565,9 @@ class CharField(Field): return value return smart_unicode(value) + def get_prep_value(self, value): + return self.to_python(value) + def formfield(self, **kwargs): # Passing max_length to forms.CharField means that the value's length # will be validated twice. This is considered acceptable since we want @@ -1006,6 +1009,11 @@ class TextField(Field): def get_internal_type(self): return "TextField" + def get_prep_value(self, value): + if isinstance(value, basestring) or value is None: + return value + return smart_unicode(value) + def formfield(self, **kwargs): defaults = {'widget': forms.Textarea} defaults.update(kwargs) diff --git a/tests/regressiontests/model_fields/models.py b/tests/regressiontests/model_fields/models.py index ab841ce409..083e86fb1c 100644 --- a/tests/regressiontests/model_fields/models.py +++ b/tests/regressiontests/model_fields/models.py @@ -55,6 +55,10 @@ class BigInt(models.Model): value = models.BigIntegerField() null_value = models.BigIntegerField(null = True, blank = True) +class Post(models.Model): + title = models.CharField(max_length=100) + body = models.TextField() + ############################################################################### # ImageField diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py index ea7b49ab7e..dd4e7462bf 100644 --- a/tests/regressiontests/model_fields/tests.py +++ b/tests/regressiontests/model_fields/tests.py @@ -6,7 +6,7 @@ from django import forms from django.db import models from django.core.exceptions import ValidationError -from models import Foo, Bar, Whiz, BigD, BigS, Image, BigInt +from models import Foo, Bar, Whiz, BigD, BigS, Image, BigInt, Post try: from decimal import Decimal @@ -227,3 +227,16 @@ class BigIntegerFieldTests(django.test.TestCase): b = BigInt.objects.get(value = '10') self.assertEqual(b.value, 10) +class TypeCoercionTests(django.test.TestCase): + """ + Test that database lookups can accept the wrong types and convert + them with no error: especially on Postgres 8.3+ which does not do + automatic casting at the DB level. See #10015. + + """ + def test_lookup_integer_in_charfield(self): + self.assertEquals(Post.objects.filter(title=9).count(), 0) + + def test_lookup_integer_in_textfield(self): + self.assertEquals(Post.objects.filter(body=24).count(), 0) +