Index: django/forms/models.py
===================================================================
--- django/forms/models.py      (revision 8642)
+++ django/forms/models.py      (working copy)
@@ -96,7 +96,7 @@
     the ``fields`` argument.
     """
     # avoid a circular import
-    from django.db.models.fields.related import ManyToManyField, OneToOneField
+    from django.db.models.fields.related import ManyToManyField, OneToOneField, ForeignKey
     opts = instance._meta
     data = {}
     for f in opts.fields + opts.many_to_many:
@@ -117,6 +117,10 @@
                 data[f.name] = [obj.pk for obj in f.value_from_object(instance)]
         elif isinstance(f, OneToOneField):
             data[f.attname] = f.value_from_object(instance)
+            data[f.name] = data[f.attname]
+        elif isinstance(f, ForeignKey) and f.primary_key and f.unique:
+            data[f.attname] = f.value_from_object(instance)
+            data[f.name] = data[f.attname]
         else:
             data[f.name] = f.value_from_object(instance)
     return data
@@ -319,7 +323,12 @@
 
     def add_fields(self, form, index):
         """Add a hidden field for the object's primary key."""
-        if self.model._meta.pk.auto_created:
+        # include both edges ot OneToOne Primary key, and 
+        # ForeignKey, primary key, unique .. which is a OneToOne in reality
+        from django.db.models.fields.related import OneToOneField, ForeignKey
+        if self.model._meta.pk.auto_created or (self.model._meta.pk.primary_key \
+               and ((isinstance(self.model._meta.pk, OneToOneField)) or \
+               (isinstance(self.model._meta.pk, ForeignKey) and self.model._meta.pk.unique))):
             self._pk_field_name = self.model._meta.pk.attname
             form.fields[self._pk_field_name] = IntegerField(required=False, widget=HiddenInput)
         super(BaseModelFormSet, self).add_fields(form, index)
