diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -883,6 +883,7 @@
         'invalid': _("'%s' value must be an integer."),
     }
     description = _("Integer")
+    MAX_INT = 2147483647
 
     def get_prep_value(self, value):
         if value is None:
@@ -908,7 +909,9 @@
             raise exceptions.ValidationError(msg)
 
     def formfield(self, **kwargs):
-        defaults = {'form_class': forms.IntegerField}
+        defaults = {'form_class': forms.IntegerField,
+                    'min_value': -IntegerField.MAX_INT - 1,
+                    'max_value': IntegerField.MAX_INT}
         defaults.update(kwargs)
         return super(IntegerField, self).formfield(**defaults)
 
diff --git a/tests/regressiontests/model_forms_regress/models.py b/tests/regressiontests/model_forms_regress/models.py
--- a/tests/regressiontests/model_forms_regress/models.py
+++ b/tests/regressiontests/model_forms_regress/models.py
@@ -69,3 +69,7 @@
 
     class Meta:
         unique_together = (('author', 'publication'), ('publication', 'edition'),)
+
+class TooLargeIntegers(models.Model):
+    integer = models.IntegerField(null=True, blank=True)
+    big_integer = models.BigIntegerField(null=True, blank=True)
diff --git a/tests/regressiontests/model_forms_regress/tests.py b/tests/regressiontests/model_forms_regress/tests.py
--- a/tests/regressiontests/model_forms_regress/tests.py
+++ b/tests/regressiontests/model_forms_regress/tests.py
@@ -9,7 +9,8 @@
 from django.test import TestCase
 
 from models import (Person, RealPerson, Triple, FilePathModel, Article,
-    Publication, CustomFF, Author, Author1, Homepage, Document, Edition)
+    Publication, CustomFF, Author, Author1, Homepage, Document, Edition,
+    TooLargeIntegers)
 
 
 class ModelMultipleChoiceFieldTests(TestCase):
@@ -490,3 +491,27 @@
     def test_modelform_factory_metaclass(self):
         new_cls = modelform_factory(Person, form=CustomMetaclassForm)
         self.assertEqual(new_cls.base_fields, {})
+
+class TooLargeIntegersTestCase(TestCase):
+
+    def test_integers(self):
+        for sign in (-1, 1):
+            for diff in (-1, 0, 1):
+                value = sign * (2 ** 31 + diff)
+                form = modelform_factory(TooLargeIntegers)({'integer': value})
+                if form.is_valid():
+                    pk = form.save().pk
+                    self.assertEqual(TooLargeIntegers.objects.get(pk=pk).integer, value)
+        self.assertEqual(TooLargeIntegers.objects.count(), 3)
+        self.assertEqual(TooLargeIntegers.objects.filter(integer__gt=0).count(), 1)
+
+    def test_big_integers(self):
+        for sign in (-1, 1):
+            for diff in (-1, 0, 1):
+                value = sign * (2 ** 63 + diff)
+                form = modelform_factory(TooLargeIntegers)({'big_integer': value})
+                if form.is_valid():
+                    pk = form.save().pk
+                    self.assertEqual(TooLargeIntegers.objects.get(pk=pk).big_integer, value)
+        self.assertEqual(TooLargeIntegers.objects.count(), 3)
+        self.assertEqual(TooLargeIntegers.objects.filter(big_integer__gt=0).count(), 1)
