diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py
index 8965a8c..e8a4b0d 100644
--- a/django/newforms/widgets.py
+++ b/django/newforms/widgets.py
@@ -262,6 +262,11 @@ class FileInput(Input):
     def value_from_datadict(self, data, files, name):
         "File widgets take data from FILES, not POST"
         return files.get(name, None)
+    
+    def _has_changed(self, initial, data):
+        if data is None:
+            return False
+        return True
 
 class Textarea(Widget):
     def __init__(self, attrs=None):
diff --git a/tests/regressiontests/forms/widgets.py b/tests/regressiontests/forms/widgets.py
index 0e69602..476179c 100644
--- a/tests/regressiontests/forms/widgets.py
+++ b/tests/regressiontests/forms/widgets.py
@@ -202,6 +202,34 @@ u'<input type="file" class="fun" name="email" />'
 >>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'})
 u'<input type="file" class="fun" name="email" />'
 
+Test for the behavior of _has_changed for FileInput. The value of data will
+more than likely come from request.FILES. The value of initial data will
+likely be a filename stored in the database. Since its value is of no use to
+a FileInput it is ignored.
+
+>>> w = FileInput()
+
+# No file was uploaded and no initial data.
+>>> w._has_changed(None, '')
+False
+
+# TODO: need to think about this case some more.
+>>> w._has_changed({}, '')
+False
+
+# A file was uploaded and no initial data.
+>>> w._has_changed({'filename': 'resume.txt', 'content': 'My resume'}, '')
+True
+
+# A file was not uploaded, but there is initial data
+>>> w._has_changed(None, 'resume.txt')
+False
+
+# A file was uploaded and there is initial data (file identity is not dealt
+# with here)
+>>> w._has_changed({'filename': 'resume.txt', 'content': 'My resume'}, 'resume.txt')
+True
+
 # Textarea Widget #############################################################
 
 >>> w = Textarea()
