diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index c18af62..fbd5e95 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -578,12 +578,12 @@ class ModelAdmin(BaseModelAdmin):
         """
         messages.info(request, message)
 
-    def save_form(self, request, form, change, commit=False):
+    def save_form(self, request, form, change):
         """
         Given a ModelForm return an unsaved instance. ``change`` is True if
         the object is being changed, and False if it's being added.
         """
-        return form.save(commit=commit)
+        return form.save(commit=False)
 
     def save_model(self, request, obj, form, change):
         """
@@ -757,11 +757,7 @@ class ModelAdmin(BaseModelAdmin):
         if request.method == 'POST':
             form = ModelForm(request.POST, request.FILES)
             if form.is_valid():
-                # Save the object, even if inline formsets haven't been
-                # validated yet. We need to pass the valid model to the
-                # formsets for validation. If the formsets do not validate, we
-                # will delete the object.
-                new_object = self.save_form(request, form, change=False, commit=True)
+                new_object = self.save_form(request, form, change=False)
                 form_validated = True
             else:
                 form_validated = False
@@ -778,15 +774,13 @@ class ModelAdmin(BaseModelAdmin):
                                   prefix=prefix, queryset=inline.queryset(request))
                 formsets.append(formset)
             if all_valid(formsets) and form_validated:
+                self.save_model(request, new_object, form, change=False)
+                form.save_m2m()
                 for formset in formsets:
                     self.save_formset(request, form, formset, change=False)
 
                 self.log_addition(request, new_object)
                 return self.response_add(request, new_object)
-            elif form_validated:
-                # The form was valid, but formsets were not, so delete the
-                # object we saved above.
-                new_object.delete()
         else:
             # Prepare the dict of initial data from the request.
             # We have to special-case M2Ms as a list of comma-separated PKs.
diff --git a/django/forms/models.py b/django/forms/models.py
index 1203233..ac30e42 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -254,6 +254,12 @@ class BaseModelForm(BaseForm):
             model_fields = set([f.name for f in self.instance._meta.fields])
             form_fields = set(self.fields)
             excluded_fields = model_fields - form_fields
+            # HACK: Don't validate InlineForeignKeyField. If the parent model
+            # hasn't been saved, it won't have a value and will fail model
+            # field validation. See #12507 for details.
+            for fname in self.fields:
+                if isinstance(self.fields[fname], InlineForeignKeyField):
+                    excluded_fields.add(fname)
             failed_fields = set(self._errors.keys())
             self.instance.full_validate(exclude=failed_fields.union(excluded_fields))
         except ValidationError, e:
