Index: forms/models.py
===================================================================
--- forms/models.py	(revision 8696)
+++ forms/models.py	(working copy)
@@ -21,7 +21,7 @@
 )
 
 def save_instance(form, instance, fields=None, fail_message='saved',
-                  commit=True):
+                  commit=True, force_insert=False, force_update=False):
     """
     Saves bound Form ``form``'s cleaned_data into model instance ``instance``.
 
@@ -52,7 +52,7 @@
                 f.save_form_data(instance, cleaned_data[f.name])
     if commit:
         # If we are committing, save the instance and the m2m data immediately.
-        instance.save()
+        instance.save(force_insert=force_insert, force_update=force_update)
         save_m2m()
     else:
         # We're not committing. Add a method to the form to allow deferred
@@ -62,14 +62,16 @@
 
 def make_model_save(model, fields, fail_message):
     """Returns the save() method for a Form."""
-    def save(self, commit=True):
-        return save_instance(self, model(), fields, fail_message, commit)
+    def save(self, commit=True, force_insert=True, force_update=False):
+        return save_instance(self, model(), fields, fail_message,
+                             commit, force_insert, force_update)
     return save
 
 def make_instance_save(instance, fields, fail_message):
     """Returns the save() method for a Form."""
-    def save(self, commit=True):
-        return save_instance(self, instance, fields, fail_message, commit)
+    def save(self, commit=True, force_insert=False, force_update=True):
+        return save_instance(self, instance, fields, fail_message,
+                             commit, force_insert, force_update)
     return save
 
 def form_for_fields(field_list):
@@ -203,7 +205,7 @@
         super(BaseModelForm, self).__init__(data, files, auto_id, prefix, object_data,
                                             error_class, label_suffix, empty_permitted)
 
-    def save(self, commit=True):
+    def save(self, commit=True, force_insert=False, force_update=False):
         """
         Saves this ``form``'s cleaned_data into model instance
         ``self.instance``.
@@ -211,11 +213,14 @@
         If commit=True, then the changes to ``instance`` will be saved to the
         database. Returns ``instance``.
         """
+        # Try to make fail message more helpful
+        # (actually only correct if pk is an AutoField)       
         if self.instance.pk is None:
             fail_message = 'created'
         else:
             fail_message = 'changed'
-        return save_instance(self, self.instance, self._meta.fields, fail_message, commit)
+        return save_instance(self, self.instance, self._meta.fields, fail_message,
+                             commit, force_insert, force_update)
 
 class ModelForm(BaseModelForm):
     __metaclass__ = ModelFormMetaclass
@@ -261,16 +266,18 @@
 
     def save_new(self, form, commit=True):
         """Saves and returns a new model instance for the given form."""
-        return save_instance(form, self.model(), commit=commit)
+        return save_instance(form, self.model(), commit=commit, force_insert=True)
 
     def save_existing(self, form, instance, commit=True):
         """Saves and returns an existing model instance for the given form."""
-        return save_instance(form, instance, commit=commit)
+        return save_instance(form, instance, commit=commit, force_update=True)
 
     def save(self, commit=True):
         """Saves model instances for every form, adding and changing instances
         as necessary, and returns the list of instances.
         """
+        # force_insert and force_update flags not supported, since the FormSet will
+        # do a mixture of these on existing and new objects
         if not commit:
             self.saved_forms = []
             def save_m2m():
@@ -369,7 +376,7 @@
     def save_new(self, form, commit=True):
         kwargs = {self.fk.get_attname(): self.instance.pk}
         new_obj = self.model(**kwargs)
-        return save_instance(form, new_obj, commit=commit)
+        return save_instance(form, new_obj, commit=commit, force_insert=True)
 
 def _get_foreign_key(parent_model, model, fk_name=None):
     """
