Index: newforms/models.py
===================================================================
--- newforms/models.py	(revision 6107)
+++ newforms/models.py	(working copy)
@@ -141,7 +141,7 @@
     # actually use any of ChoiceField's implementation.
     def __init__(self, queryset, empty_label=u"---------", cache_choices=False,
             required=True, widget=Select, label=None, initial=None, help_text=None):
-        self.queryset = queryset
+        self._queryset = queryset
         self.empty_label = empty_label
         self.cache_choices = cache_choices
         # Call Field instead of ChoiceField __init__() because we don't need
@@ -149,6 +149,15 @@
         Field.__init__(self, required, widget, label, initial, help_text)
         self.widget.choices = self.choices
 
+    def _get_queryset(self):
+        return self._queryset
+
+    def _set_queryset(self, queryset):
+        self._queryset = queryset
+        self.widget.choices = self.choices
+
+    queryset = property(_get_queryset, _set_queryset)
+
     def _get_choices(self):
         # If self._choices is set, then somebody must have manually set
         # the property self.choices. In this case, just return self._choices.
@@ -160,7 +169,7 @@
         # *each* time _get_choices() is called (and, thus, each time
         # self.choices is accessed) so that we can ensure the QuerySet has not
         # been consumed.
-        return QuerySetIterator(self.queryset, self.empty_label, self.cache_choices)
+        return QuerySetIterator(self._queryset, self.empty_label, self.cache_choices)
 
     def _set_choices(self, value):
         # This method is copied from ChoiceField._set_choices(). It's necessary
@@ -175,8 +184,10 @@
         if value in ('', None):
             return None
         try:
-            value = self.queryset.model._default_manager.get(pk=value)
-        except self.queryset.model.DoesNotExist:
+            value = self._queryset.model._default_manager.get(pk=value)
+            if not value in self._queryset:
+                raise self._queryset.model.DoesNotExist
+        except self._queryset.model.DoesNotExist:
             raise ValidationError(ugettext(u'Select a valid choice. That choice is not one of the available choices.'))
         return value
 
