Index: django/newforms/models.py
===================================================================
--- django/newforms/models.py	(revision 5726)
+++ django/newforms/models.py	(working copy)
@@ -35,17 +35,23 @@
         if fields and f.name not in fields:
             continue
         setattr(instance, f.name, cleaned_data[f.name])
-    if commit:
-        instance.save()
+    # Wrap up the saving of m2m data as a function
+    def save_m2m():
+        opts = instance.__class__._meta
+        cleaned_data = form.cleaned_data
         for f in opts.many_to_many:
             if fields and f.name not in fields:
                 continue
             if f.name in cleaned_data:
                 setattr(instance, f.attname, cleaned_data[f.name])
-    # GOTCHA: If many-to-many data is given and commit=False, the many-to-many
-    # data will be lost. This happens because a many-to-many options cannot be
-    # set on an object until after it's saved. Maybe we should raise an
-    # exception in that case.
+    if commit:
+        # If we are committing, save the instance and the m2m data immediately
+        instance.save()
+        save_m2m()
+    else:
+        # We're not committing. Add a method to the form to allow deferred 
+        # saving of m2m data
+        form.save_m2m = save_m2m
     return instance
 
 def make_model_save(model, fields, fail_message):
Index: tests/modeltests/model_forms/models.py
===================================================================
--- tests/modeltests/model_forms/models.py	(revision 5726)
+++ tests/modeltests/model_forms/models.py	(working copy)
@@ -332,6 +332,28 @@
 >>> new_art.categories.all()
 []
 
+Create a new article, with categories, via the form, but use commit=False.
+The m2m data won't be saved until save_m2m() is invoked on the form.
+>>> ArticleForm = form_for_model(Article)
+>>> f = ArticleForm({'headline': u'The walrus was Paul', 'pub_date': u'1967-11-01',
+...     'writer': u'1', 'article': u'Test.', 'categories': [u'1', u'2']})
+>>> new_art = f.save(commit=False)
+
+# Manually save the instance 
+>>> new_art.save()
+>>> new_art.id
+4
+
+# The instance doesn't have m2m data yet
+>>> new_art = Article.objects.get(id=4)
+>>> new_art.categories.all()
+[]
+
+# Save the m2m data on the form
+>>> f.save_m2m()
+>>> new_art.categories.all()
+[<Category: Entertainment>, <Category: It's a test>]
+
 Here, we define a custom Form. Because it happens to have the same fields as
 the Category model, we can use save_instance() to apply its changes to an
 existing Category instance.
