Index: django/db/models/fields/related.py
===================================================================
--- django/db/models/fields/related.py	(revision 4995)
+++ django/db/models/fields/related.py	(working copy)
@@ -553,7 +553,11 @@
         setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related))
 
     def formfield(self, **kwargs):
-        defaults = {'queryset': self.rel.to._default_manager.all(), 'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
+        defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
+	if hasattr(self.rel.limit_choices_to, 'get_sql'):
+             defaults['queryset']=self.rel.to._default_manager.filter(self.rel.limit_choices_to)
+	else:
+             defaults['queryset']=self.rel.to._default_manager.filter(**self.rel.limit_choices_to)
         defaults.update(kwargs)
         return forms.ModelChoiceField(**defaults)
 
Index: django/newforms/models.py
===================================================================
--- django/newforms/models.py	(revision 4995)
+++ django/newforms/models.py	(working copy)
@@ -161,6 +161,7 @@
             return None
         try:
             value = self.queryset.model._default_manager.get(pk=value)
+            if value not in self.queryset: raise self.queryset.model.DoesNotExist, "The specified object exists but is not among the choices."
         except self.queryset.model.DoesNotExist:
             raise ValidationError(gettext(u'Select a valid choice. That choice is not one of the available choices.'))
         return value
