Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 7011)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -13,6 +13,7 @@
 from django.core import validators
 from django import oldforms
 from django import newforms as forms
+from django.newforms.util import InitialData
 from django.core.exceptions import ObjectDoesNotExist
 from django.utils.functional import curry
 from django.utils.itercompat import tee
@@ -797,7 +798,7 @@
         return os.path.normpath(f)
 
     def save_form_data(self, instance, data):
-        if data:
+        if data and not isinstance(data, InitialData):
             getattr(instance, "save_%s_file" % self.name)(data.filename, data.content, save=False)
 
     def formfield(self, **kwargs):
Index: django/newforms/util.py
===================================================================
--- django/newforms/util.py	(revision 7011)
+++ django/newforms/util.py	(working copy)
@@ -67,3 +67,10 @@
         # AttributeError: ValidationError instance has no attribute 'args'
         # See http://www.python.org/doc/current/tut/node10.html#handling
         return repr(self.messages)
+
+class InitialData(object):
+
+    value = None
+
+    def __init__(self, value):
+        self.value = value
Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 7011)
+++ django/newforms/fields.py	(working copy)
@@ -19,7 +19,7 @@
 from django.utils.translation import ugettext_lazy as _
 from django.utils.encoding import StrAndUnicode, smart_unicode, smart_str
 
-from util import ErrorList, ValidationError
+from util import ErrorList, ValidationError, InitialData
 from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput
 
 
@@ -441,6 +441,8 @@
         super(FileField, self).clean(data)
         if not self.required and data in EMPTY_VALUES:
             return None
+        elif self.required and isinstance(data, InitialData):
+            return data 
         try:
             f = UploadedFile(data['filename'], data['content'])
         except TypeError:
Index: django/newforms/forms.py
===================================================================
--- django/newforms/forms.py	(revision 7011)
+++ django/newforms/forms.py	(working copy)
@@ -9,7 +9,7 @@
 from django.utils.encoding import StrAndUnicode, smart_unicode, force_unicode
 from django.utils.safestring import mark_safe
 
-from fields import Field
+from fields import Field, EMPTY_VALUES
 from widgets import TextInput, Textarea
 from util import flatatt, ErrorDict, ErrorList, ValidationError
 
@@ -181,6 +181,8 @@
             # Each widget type knows how to retrieve its own data, because some
             # widgets split data over several HTML fields.
             value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
+            if value in EMPTY_VALUES:
+                value = field.widget.value_from_initial(self.initial, name, value)
             try:
                 value = field.clean(value)
                 self.cleaned_data[name] = value
Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py	(revision 7011)
+++ django/newforms/widgets.py	(working copy)
@@ -15,7 +15,7 @@
 from django.utils.translation import ugettext
 from django.utils.encoding import StrAndUnicode, force_unicode
 from django.utils.safestring import mark_safe
-from util import flatatt
+from util import flatatt, InitialData
 
 __all__ = (
     'Widget', 'TextInput', 'PasswordInput',
@@ -77,6 +77,9 @@
         return id_
     id_for_label = classmethod(id_for_label)
 
+    def value_from_initial(self, initial, name, data):
+        return data
+
 class Input(Widget):
     """
     Base class for all <input> widgets (except type='checkbox' and
@@ -143,6 +146,12 @@
         "File widgets take data from FILES, not POST"
         return files.get(name, None)
 
+    def value_from_initial(self, initial, name, data):
+        if initial.has_key(name):
+            return InitialData(initial.get(name))
+        else:
+            return data
+
 class Textarea(Widget):
     def __init__(self, attrs=None):
         # The 'rows' and 'cols' attributes are required for HTML correctness.
Index: tests/modeltests/model_forms/models.py
===================================================================
--- tests/modeltests/model_forms/models.py	(revision 7011)
+++ tests/modeltests/model_forms/models.py	(working copy)
@@ -55,6 +55,13 @@
     def __unicode__(self):
         return self.phone
 
+class TextFile(models.Model):
+    file = models.FileField(upload_to='textfiles')
+    description = models.CharField(max_length=20)
+
+    def __unicode__(self):
+        return self.description
+
 __test__ = {'API_TESTS': """
 >>> from django import newforms as forms
 >>> from django.newforms.models import ModelForm
@@ -701,4 +708,23 @@
 True
 >>> f.cleaned_data
 {'phone': u'312-555-1212', 'description': u'Assistance'}
+
+>>> class TextFileForm(ModelForm):
+...     class Meta:
+...         model = TextFile
+>>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename':'test.txt', 'content': 'testtext'}})
+>>> f.is_valid()
+True
+>>> f.cleaned_data['file'].__class__.__name__
+'UploadedFile'
+>>> instance = f.save()
+>>> print instance.file
+textfiles/test.txt
+>>> f = TextFileForm(data={'description': u'Assistance'}, instance=instance)
+>>> f.is_valid()
+True
+>>> instance = f.save()
+>>> print instance.file
+textfiles/test.txt
+>>> instance.delete()
 """}
