Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revision 10174)
+++ django/forms/models.py	(working copy)
@@ -729,6 +729,7 @@
         'list': _(u'Enter a list of values.'),
         'invalid_choice': _(u'Select a valid choice. %s is not one of the'
                             u' available choices.'),
+        'invalid_pk_value': _(u'"%s" is not a valid value for a primary key.')
     }
 
     def __init__(self, queryset, cache_choices=False, required=True,
@@ -751,6 +752,8 @@
                 obj = self.queryset.get(pk=val)
             except self.queryset.model.DoesNotExist:
                 raise ValidationError(self.error_messages['invalid_choice'] % val)
+            except ValueError:
+                raise ValidationError(self.error_messages['invalid_pk_value'] % val)
             else:
                 final_values.append(obj)
         return final_values
Index: tests/modeltests/model_forms/models.py
===================================================================
--- tests/modeltests/model_forms/models.py	(revision 10174)
+++ tests/modeltests/model_forms/models.py	(working copy)
@@ -857,6 +857,10 @@
 Traceback (most recent call last):
 ...
 ValidationError: [u'Enter a list of values.']
+>>> f.clean(['fail'])
+Traceback (most recent call last):
+...
+ValidationError: [u'"fail" is not a valid value for a primary key.']
 
 # Add a Category object *after* the ModelMultipleChoiceField has already been
 # instantiated. This proves clean() checks the database during clean() rather
