Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 4504)
+++ django/newforms/fields.py	(working copy)
@@ -339,8 +339,8 @@
 
     def _set_choices(self, value):
         # Setting choices also sets the choices on the widget.
-        self._choices = value
-        self.widget.choices = value
+        # And choices can be any iterable, but will be consumed more than once.
+        self._choices = self.widget.choices = list(value)
 
     choices = property(_get_choices, _set_choices)
 
Index: tests/regressiontests/forms/tests.py
===================================================================
--- tests/regressiontests/forms/tests.py	(revision 4504)
+++ tests/regressiontests/forms/tests.py	(working copy)
@@ -314,6 +314,22 @@
 <option value="4">4</option>
 </select>
 
+Really, the 'choices' argument can be any iterable:
+>>> from itertools import chain
+>>> things = ({'id':1, 'name':'And Boom'}, {'id':2, 'name':'One More Thing!'})
+>>> class SomeForm(Form):
+...     somechoice = ChoiceField(choices=chain((('', '-'*9),), ( (thing['id'], thing['name']) for thing in things )))
+>>> f = SomeForm()
+>>> f.as_table()
+u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>'
+>>> f.as_table()
+u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="" selected="selected">---------</option>\n<option value="1">And Boom</option>\n<option value="2">One More Thing!</option>\n</select></td></tr>'
+
+One More Thing:
+>>> f = SomeForm({'somechoice': 2})
+>>> f.as_table()
+u'<tr><th><label for="id_somechoice">Somechoice:</label></th><td><select name="somechoice" id="id_somechoice">\n<option value="">---------</option>\n<option value="1">And Boom</option>\n<option value="2" selected="selected">One More Thing!</option>\n</select></td></tr>'
+
 You can also pass 'choices' to the constructor:
 >>> w = Select(choices=[(1, 1), (2, 2), (3, 3)])
 >>> print w.render('num', 2)
