Index: django/contrib/contenttypes/views.py
===================================================================
--- django/contrib/contenttypes/views.py	(revision 12623)
+++ django/contrib/contenttypes/views.py	(working copy)
@@ -1,7 +1,7 @@
 from django import http
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.sites.models import Site
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist, ValidationError
 
 def shortcut(request, content_type_id, object_id):
     "Redirect to an object's page based on a content-type ID and an object ID."
@@ -9,7 +9,7 @@
     try:
         content_type = ContentType.objects.get(pk=content_type_id)
         obj = content_type.get_object_for_this_type(pk=object_id)
-    except (ObjectDoesNotExist, ValueError):
+    except (ObjectDoesNotExist, ValidationError):
         raise http.Http404("Content type %s object %s doesn't exist" % (content_type_id, object_id))
     try:
         absurl = obj.get_absolute_url()
Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 12623)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -495,9 +495,7 @@
         pass
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return int(value)
+        return self.to_python(value)
 
     def contribute_to_class(self, cls, name):
         assert not cls._meta.has_auto_field, "A model can't have more than one AutoField."
@@ -544,9 +542,7 @@
         return super(BooleanField, self).get_prep_lookup(lookup_type, value)
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return bool(value)
+        return self.to_python(value)
 
     def formfield(self, **kwargs):
         # Unlike most fields, BooleanField figures out include_blank from
@@ -848,9 +844,7 @@
     description = _("Floating point number")
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return float(value)
+        return self.to_python(value)
 
     def get_internal_type(self):
         return "FloatField"
@@ -871,14 +865,12 @@
 class IntegerField(Field):
     empty_strings_allowed = False
     default_error_messages = {
-        'invalid': _("This value must be a float."),
+        'invalid': _("This value must be an integer."),
     }
     description = _("Integer")
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return int(value)
+        return self.to_python(value)
 
     def get_internal_type(self):
         return "IntegerField"
@@ -961,9 +953,7 @@
         return super(NullBooleanField, self).get_prep_lookup(lookup_type, value)
 
     def get_prep_value(self, value):
-        if value is None:
-            return None
-        return bool(value)
+        return self.to_python(value)
 
     def formfield(self, **kwargs):
         defaults = {
Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revision 12623)
+++ django/forms/models.py	(working copy)
@@ -999,7 +999,7 @@
         for pk in value:
             try:
                 self.queryset.filter(pk=pk)
-            except ValueError:
+            except ValidationError:
                 raise ValidationError(self.error_messages['invalid_pk_value'] % pk)
         qs = self.queryset.filter(pk__in=value)
         pks = set([force_unicode(o.pk) for o in qs])
Index: tests/modeltests/expressions/models.py
===================================================================
--- tests/modeltests/expressions/models.py	(revision 12623)
+++ tests/modeltests/expressions/models.py	(working copy)
@@ -127,6 +127,6 @@
 >>> acme.save()
 Traceback (most recent call last):
 ...
-TypeError: int() argument must be a string or a number...
+ValidationError: [u'This value must be an integer.']
 
 """}
Index: tests/regressiontests/model_fields/tests.py
===================================================================
--- tests/regressiontests/model_fields/tests.py	(revision 12623)
+++ tests/regressiontests/model_fields/tests.py	(working copy)
@@ -25,14 +25,36 @@
             ImageFieldUsingFileTests, \
             TwoImageFieldTests
 
-
+class AutoFieldTests(django.test.TestCase):
+    def test_to_python(self):
+        f = models.AutoField(primary_key=True)
+        self.assertEqual(f.to_python(3), 3)
+        self.assertEqual(f.to_python("3"), 3)
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.to_python, "abc")
+    
+    def test_get_db_prep_value(self):
+        f = models.AutoField(primary_key=True)
+        self.assertEqual(f.get_db_prep_value(3), 3)
+        self.assertEqual(f.get_db_prep_value("3"), 3)
+        self.assertEqual(f.get_db_prep_value(None), None)
+        self.assertRaises(ValidationError, f.get_db_prep_value, "abc")
+        
 class DecimalFieldTests(django.test.TestCase):
     def test_to_python(self):
         f = models.DecimalField(max_digits=4, decimal_places=2)
         self.assertEqual(f.to_python(3), Decimal("3"))
         self.assertEqual(f.to_python("3.14"), Decimal("3.14"))
-        self.assertRaises(ValidationError, f.to_python, "abc")
+        self.assertEqual(f.to_python(None), None)
+	self.assertRaises(ValidationError, f.to_python, "abc")
 
+    def test_get_db_prep_value(self):
+        f = models.DecimalField(max_digits=4, decimal_places=2)
+        self.assertEqual(f.get_db_prep_value(3), 3)
+        self.assertEqual(f.get_db_prep_value("3.14"), Decimal("3.14"))
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.get_db_prep_value, "abc")
+
     def test_default(self):
         f = models.DecimalField(default=Decimal("0.00"))
         self.assertEqual(f.get_default(), Decimal("0.00"))
@@ -73,6 +95,36 @@
         # This should not crash. That counts as a win for our purposes.
         Foo.objects.filter(d__gte=100000000000)
 
+class IntegerFieldTests(django.test.TestCase):
+    def test_to_python(self):
+        f = models.IntegerField()
+        self.assertEqual(f.to_python(3), 3)
+        self.assertEqual(f.to_python("3"), 3)
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.to_python, "abc")
+    
+    def test_get_db_prep_value(self):
+        f = models.IntegerField()
+        self.assertEqual(f.get_db_prep_value(3), 3)
+        self.assertEqual(f.get_db_prep_value("3"), 3)
+        self.assertEqual(f.get_db_prep_value(None), None)
+        self.assertRaises(ValidationError, f.get_db_prep_value, "abc")
+
+class FloatFieldTests(django.test.TestCase):
+    def test_to_python(self):
+        f = models.FloatField()
+        self.assertEqual(f.to_python(3), float("3"))
+        self.assertEqual(f.to_python("3.14"), float("3.14"))
+        self.assertEqual(f.to_python(None), None)
+	self.assertRaises(ValidationError, f.to_python, "abc")
+
+    def test_get_db_prep_value(self):
+        f = models.FloatField()
+        self.assertEqual(f.get_db_prep_value(3), float(3))
+        self.assertEqual(f.get_db_prep_value("3.14"), float("3.14"))
+        self.assertEqual(f.to_python(None), None)
+        self.assertRaises(ValidationError, f.get_db_prep_value, "abc")
+
 class ForeignKeyTests(django.test.TestCase):
     def test_callable_default(self):
         """Test the use of a lazy callable for ForeignKey.default"""
@@ -106,17 +158,21 @@
         self.assertEqual(f.get_db_prep_lookup('exact', False, connection=connection), [False])
         self.assertEqual(f.get_db_prep_lookup('exact', '0', connection=connection), [False])
         self.assertEqual(f.get_db_prep_lookup('exact', 0, connection=connection), [False])
-        self.assertEqual(f.get_db_prep_lookup('exact', None, connection=connection), [None])
 
+
     def _test_to_python(self, f):
         self.assertTrue(f.to_python(1) is True)
         self.assertTrue(f.to_python(0) is False)
 
     def test_booleanfield_get_db_prep_lookup(self):
+        from django.db import connection
         self._test_get_db_prep_lookup(models.BooleanField())
+        self.assertRaises(ValidationError, models.BooleanField().get_db_prep_lookup, 'exact', None)
 
     def test_nullbooleanfield_get_db_prep_lookup(self):
+        from django.db import connection
         self._test_get_db_prep_lookup(models.NullBooleanField())
+        self.assertEqual(models.NullBooleanField().get_db_prep_lookup('exact', None, connection=connection), [None])
 
     def test_booleanfield_to_python(self):
         self._test_to_python(models.BooleanField())
