Index: django/db/models/fields/files.py
===================================================================
--- django/db/models/fields/files.py	(revision 9646)
+++ django/db/models/fields/files.py	(working copy)
@@ -188,7 +188,9 @@
         return os.path.join(self.get_directory_name(), self.get_filename(filename))
 
     def save_form_data(self, instance, data):
-        if data and isinstance(data, UploadedFile):
+	if data is False:
+            getattr(instance, self.name).delete(save=False)
+        elif data and isinstance(data, UploadedFile):
             getattr(instance, self.name).save(data.name, data, save=False)
 
     def formfield(self, **kwargs):
Index: django/forms/fields.py
===================================================================
--- django/forms/fields.py	(revision 9646)
+++ django/forms/fields.py	(working copy)
@@ -453,8 +453,11 @@
 
     def clean(self, data, initial=None):
         super(FileField, self).clean(initial or data)
-        if not self.required and data in EMPTY_VALUES:
-            return None
+        if not self.required:
+	    if data is False:
+		return False
+	    elif data in EMPTY_VALUES:
+		return None
         elif not data and initial:
             return initial
 
@@ -483,8 +486,8 @@
         PNG, possibly others -- whatever the Python Imaging Library supports).
         """
         f = super(ImageField, self).clean(data, initial)
-        if f is None:
-            return None
+        if not f:
+            return f
         elif not data and initial:
             return initial
         from PIL import Image
Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 9646)
+++ django/contrib/admin/options.py	(working copy)
@@ -105,9 +105,12 @@
             kwargs['widget'] = widgets.AdminTextInputWidget
             return db_field.formfield(**kwargs)
     
-        # For FileFields and ImageFields add a link to the current file.
+        # For FileFields and ImageFields add a link to the current file and a delete option where appropriate
         if isinstance(db_field, models.ImageField) or isinstance(db_field, models.FileField):
-            kwargs['widget'] = widgets.AdminFileWidget
+	    if db_field.blank:
+		kwargs['widget'] = widgets.AdminClearableFileWidget
+	    else:
+                kwargs['widget'] = widgets.AdminFileWidget
             return db_field.formfield(**kwargs)
 
         # For ForeignKey or ManyToManyFields, use a special widget.
Index: django/contrib/admin/widgets.py
===================================================================
--- django/contrib/admin/widgets.py	(revision 9646)
+++ django/contrib/admin/widgets.py	(working copy)
@@ -95,6 +95,34 @@
         output.append(super(AdminFileWidget, self).render(name, value, attrs))
         return mark_safe(u''.join(output))
 
+
+class AdminClearableFileWidget(AdminFileWidget):
+    def render(self, name, value, attrs=None):
+        output = [super(AdminClearableFileWidget, self).render(name, value, attrs)]
+        if value and hasattr(value, "url"):
+            checkbox = forms.CheckboxInput()
+            checkbox_name = name + '-delete'
+	    output.append('&nbsp;')
+            output.append(_('Delete?'))
+            output.append(checkbox.render(checkbox_name, False, attrs))
+        return mark_safe(u''.join(output))
+
+    def value_from_datadict(self, data, files, name):
+        """Checks to see whether a file was uploaded and if not,
+	whether the Delete checkbox was set.
+	
+	To allow _has_changed to determine between no change and
+	and delete request, no change will return None and deletion
+	will return False.
+	"""
+	try:
+	    return files[name]
+	except KeyError:
+	    if (name + '-delete') in data:
+		return False
+            return None
+
+
 class ForeignKeyRawIdWidget(forms.TextInput):
     """
     A Widget for displaying ForeignKeys in the "raw_id" interface rather than
