Index: django/newforms/models.py
===================================================================
--- django/newforms/models.py	(revision 133)
+++ django/newforms/models.py	(working copy)
@@ -13,10 +13,22 @@
 from widgets import Select, SelectMultiple, MultipleHiddenInput
 
 __all__ = (
-    'save_instance', 'form_for_model', 'form_for_instance', 'form_for_fields',
-    'ModelChoiceField', 'ModelMultipleChoiceField'
+    'init_from_instance', 'save_instance', 'form_for_model',
+    'form_for_instance', 'form_for_fields', 'ModelChoiceField',
+    'ModelMultipleChoiceField'
 )
 
+def init_from_instance(form, instance, fields=None):
+    """
+    Populates the initial data of Form ``form`` from model instance
+    ``instance``.
+    """
+    opts = instance.__class__._meta
+    for f in opts.fields:
+        if fields and f.name not in fields:
+            continue
+        form.initial[f.name] = f.value_from_object(instance)
+
 def save_instance(form, instance, fields=None, fail_message='saved', commit=True):
     """
     Saves bound Form ``form``'s cleaned_data into model instance ``instance``.
@@ -54,6 +66,21 @@
         form.save_m2m = save_m2m
     return instance
 
+def make_model_init(form, fields):
+    """Returns the __init__() method for a Form."""
+    def __init__(self, instance=None, **kwargs):
+        if instance:
+            opts = instance.__class__._meta
+            initial = kwargs.setdefault('initial', {})
+            for f in opts.fields:
+                if not f.editable or f.name in initial:
+                    continue
+                if fields and f.name not in fields:
+                    continue
+                initial[f.name] = f.value_from_object(instance)
+        form.__init__(self, **kwargs)
+    return __init__
+
 def make_model_save(model, fields, fail_message):
     "Returns the save() method for a Form."
     def save(self, commit=True):
@@ -88,7 +115,8 @@
             field_list.append((f.name, formfield))
     base_fields = SortedDictFromList(field_list)
     return type(opts.object_name + 'Form', (form,), 
-        {'base_fields': base_fields, '_model': model, 'save': make_model_save(model, fields, 'created')})
+        {'base_fields': base_fields, '_model': model, '__init__': make_model_init(form, fields),
+         'save': make_model_save(model, fields, 'created')})
 
 def form_for_instance(instance, form=BaseForm, fields=None, formfield_callback=lambda f, **kwargs: f.formfield(**kwargs)):
     """
