Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revision 10844)
+++ django/forms/models.py	(working copy)
@@ -464,8 +464,23 @@
             return len(self.get_queryset())
         return super(BaseModelFormSet, self).initial_form_count()
 
+    def _construct_forms(self, *args, **kwargs):
+        if self.is_bound:
+            self._queryset_dict = dict([(o.pk, o) for o in self.get_queryset()])
+        super(BaseModelFormSet, self)._construct_forms(*args, **kwargs)
+        if self.is_bound:
+            del self._queryset_dict
+
     def _construct_form(self, i, **kwargs):
-        if i < self.initial_form_count():
+        if self.is_bound and i < self.initial_form_count():
+            pk_key = "%s-%s" % (self.add_prefix(i), self.model._meta.pk.name)
+            pk = self.data[pk_key]
+            pk_field = self.model._meta.pk
+            pk = pk_field.get_db_prep_lookup('exact', pk)
+            if isinstance(pk, list):
+                pk = pk[0]
+            kwargs['instance'] = self._queryset_dict.get(pk)
+        if i < self.initial_form_count() and not kwargs.get('instance'):
             kwargs['instance'] = self.get_queryset()[i]
         return super(BaseModelFormSet, self)._construct_form(i, **kwargs)
 
@@ -663,10 +678,13 @@
             return ((not pk.editable) or (pk.auto_created or isinstance(pk, AutoField))
                 or (pk.rel and pk.rel.parent_link and pk_is_not_editable(pk.rel.to._meta.pk)))
         if pk_is_not_editable(pk) or pk.name not in form.fields:
-            try:
-                pk_value = self.get_queryset()[index].pk
-            except IndexError:
-                pk_value = None
+            if form.is_bound:
+                pk_value = form.instance.pk 
+            else:       
+                try:
+                    pk_value = self.get_queryset()[index].pk
+                except IndexError:      
+                    pk_value = None
             if isinstance(pk, OneToOneField) or isinstance(pk, ForeignKey):
                 qs = pk.rel.to._default_manager.get_query_set()
             else:
