Index: django/forms/fields.py
===================================================================
--- django/forms/fields.py	(revision 12835)
+++ django/forms/fields.py	(working copy)
@@ -597,7 +597,10 @@
         # Setting choices also sets the choices on the widget.
         # choices can be any iterable, but we call list() on it because
         # it will be consumed more than once.
-        self._choices = self.widget.choices = list(value)
+        if callable(value):
+            value = value()
+        value = list(value)
+        self._choices = self.widget.choices = value
 
     choices = property(_get_choices, _set_choices)
 
Index: tests/regressiontests/forms/fields.py
===================================================================
--- tests/regressiontests/forms/fields.py	(revision 12835)
+++ tests/regressiontests/forms/fields.py	(working copy)
@@ -625,6 +625,14 @@
         self.assertEqual(u'5', f.clean('5'))
         self.assertRaisesErrorWithMessage(ValidationError, "[u'Select a valid choice. 6 is not one of the available choices.']", f.clean, '6')
 
+    def test_choicefield_callable(self):
+        choices = lambda: [('J', 'John'), ('P', 'Paul')]
+        f = ChoiceField(choices=choices)
+        self.assertEqual(u'J', f.clean('J'))
+        
+    def test_choicefield_callable_2(self):
+        choices = lambda: 1
+        self.assertRaisesErrorWithMessage(TypeError, "'int' object is not iterable", ChoiceField, choices=choices)
     # TypedChoiceField ############################################################
     # TypedChoiceField is just like ChoiceField, except that coerced types will
     # be returned:
