Index: django/views/generic/create_update.py
===================================================================
--- django/views/generic/create_update.py	(revision 6635)
+++ django/views/generic/create_update.py	(working copy)
@@ -1,7 +1,6 @@
 from django.core.xheaders import populate_xheaders
 from django.template import loader
-from django import oldforms
-from django.db.models import FileField
+from django import newforms as forms
 from django.contrib.auth.views import redirect_to_login
 from django.template import RequestContext
 from django.http import Http404, HttpResponse, HttpResponseRedirect
@@ -10,7 +9,8 @@
 
 def create_object(request, model, template_name=None,
         template_loader=loader, extra_context=None, post_save_redirect=None,
-        login_required=False, follow=None, context_processors=None):
+        login_required=False, context_processors=None, form=forms.BaseForm,
+        formfield_callback=lambda f, **kwargs: f.formfield(**kwargs)):
     """
     Generic object-creation function.
 
@@ -23,22 +23,13 @@
     if login_required and not request.user.is_authenticated():
         return redirect_to_login(request.path)
 
-    manipulator = model.AddManipulator(follow=follow)
-    if request.POST:
-        # If data was POSTed, we're trying to create a new object
-        new_data = request.POST.copy()
+    ModelForm = forms.form_for_model(model, form=form, formfield_callback=formfield_callback)
+    if request.method == 'POST':
+        form = ModelForm(request.POST, request.FILES)
+        
+        if form.is_valid():
+            new_object = form.save()
 
-        if model._meta.has_field_type(FileField):
-            new_data.update(request.FILES)
-
-        # Check for errors
-        errors = manipulator.get_validation_errors(new_data)
-        manipulator.do_html2python(new_data)
-
-        if not errors:
-            # No errors -- this means we can save the data!
-            new_object = manipulator.save(new_data)
-
             if request.user.is_authenticated():
                 request.user.message_set.create(message=ugettext("The %(verbose_name)s was created successfully.") % {"verbose_name": model._meta.verbose_name})
 
@@ -51,12 +42,9 @@
             else:
                 raise ImproperlyConfigured("No URL to redirect to from generic create view.")
     else:
-        # No POST, so we want a brand new form without any data or errors
-        errors = {}
-        new_data = manipulator.flatten_data()
+        form = ModelForm()
 
-    # Create the FormWrapper, template, context, response
-    form = oldforms.FormWrapper(manipulator, new_data, errors)
+    # Create the template, context, response
     if not template_name:
         template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
     t = template_loader.get_template(template_name)
@@ -73,8 +61,9 @@
 def update_object(request, model, object_id=None, slug=None,
         slug_field='slug', template_name=None, template_loader=loader,
         extra_context=None, post_save_redirect=None,
-        login_required=False, follow=None, context_processors=None,
-        template_object_name='object'):
+        login_required=False, context_processors=None,
+        template_object_name='object', form=forms.BaseForm,
+        formfield_callback=lambda f, **kwargs: f.formfield(**kwargs)):
     """
     Generic object-update function.
 
@@ -102,16 +91,12 @@
     except ObjectDoesNotExist:
         raise Http404, "No %s found for %s" % (model._meta.verbose_name, lookup_kwargs)
 
-    manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.attname), follow=follow)
+    ModelForm = forms.form_for_instance(object, form=form, formfield_callback=formfield_callback)
 
-    if request.POST:
-        new_data = request.POST.copy()
-        if model._meta.has_field_type(FileField):
-            new_data.update(request.FILES)
-        errors = manipulator.get_validation_errors(new_data)
-        manipulator.do_html2python(new_data)
-        if not errors:
-            object = manipulator.save(new_data)
+    if request.method == 'POST':
+        form = ModelForm(request.POST, request.FILES)
+        if form.is_valid():
+            object = form.save()
 
             if request.user.is_authenticated():
                 request.user.message_set.create(message=ugettext("The %(verbose_name)s was updated successfully.") % {"verbose_name": model._meta.verbose_name})
@@ -124,11 +109,8 @@
             else:
                 raise ImproperlyConfigured("No URL to redirect to from generic create view.")
     else:
-        errors = {}
-        # This makes sure the form acurate represents the fields of the place.
-        new_data = manipulator.flatten_data()
+        form = ModelForm()
 
-    form = oldforms.FormWrapper(manipulator, new_data, errors)
     if not template_name:
         template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
     t = template_loader.get_template(template_name)
