Index: contrib/admin/urls/admin.py
===================================================================
--- contrib/admin/urls/admin.py	(revision 2521)
+++ contrib/admin/urls/admin.py	(working copy)
@@ -53,6 +53,7 @@
     ('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/add/$', 'django.contrib.admin.views.main.add_stage'),
     ('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/(?P<object_id>.+)/history/$', 'django.contrib.admin.views.main.history'),
     ('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/(?P<object_id>.+)/delete/$', 'django.contrib.admin.views.main.delete_stage'),
+    ('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/(?P<object_id>.+)/delete_file/(?P<attname>.+)/$', 'django.contrib.admin.views.main.delete_file'),
     ('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/(?P<object_id>.+)/$', 'django.contrib.admin.views.main.change_stage'),
 )
 urlpatterns = patterns('', *urlpatterns)
Index: contrib/admin/templatetags/admin_modify.py
===================================================================
--- contrib/admin/templatetags/admin_modify.py	(revision 2521)
+++ contrib/admin/templatetags/admin_modify.py	(working copy)
@@ -243,3 +243,14 @@
 def object_pk(bound_manip, ordered_obj):
     return bound_manip.get_ordered_object_pk(ordered_obj)
 object_pk = register.simple_tag(object_pk)
+
+def admin_file_delete_link(bound_field):
+    s = ''
+    container_obj = bound_field.original
+    if container_obj:
+        inf = container_obj._meta
+        pk = getattr(container_obj,inf.pk.name)
+        s = "../../../%s/%s/%s/delete_file/%s/" % \
+            (inf.app_label,inf.module_name,pk,bound_field.field.attname)
+    return s
+admin_file_delete_link = register.simple_tag(admin_file_delete_link)
Index: contrib/admin/views/main.py
===================================================================
--- contrib/admin/views/main.py	(revision 2521)
+++ contrib/admin/views/main.py	(working copy)
@@ -670,3 +670,19 @@
         'object': obj,
     }, context_instance=Context(request))
 history = staff_member_required(history)
+
+def delete_file(request, app_label, module_name, object_id,attname):
+    try:
+        mod = meta.get_module(app_label, module_name)
+    except ImportError:
+        raise Http404
+    opts = mod.Klass._meta
+    if not request.user.has_perm(app_label + '.' + opts.get_delete_permission()):
+        raise PermissionDenied
+    obj = get_object_or_404(mod, pk=object_id)
+    try:
+        delete_f = getattr(obj, 'delete_%s_file' % attname)
+        delete_f()
+    except AttributeError: pass
+    return HttpResponseRedirect(request.META['HTTP_REFERER'])
+delete_file = staff_member_required(delete_file)
Index: contrib/admin/templates/widget/file.html
===================================================================
--- contrib/admin/templates/widget/file.html	(revision 2521)
+++ contrib/admin/templates/widget/file.html	(working copy)
@@ -1,4 +1,7 @@
 {% load admin_modify i18n %}{% if bound_field.original_value %}
-{% trans "Currently:" %} <a href="{{ bound_field.original_url }}" > {{ bound_field.original_value }} </a><br />
+{% trans "Currently:" %} <a href="{{ bound_field.original_url }}" > {{ bound_field.original_value }} </a>
+<br />
+<a href="{% admin_file_delete_link bound_field %}">{% trans "Delete this file." %}</a>
+<br />
 {% trans "Change:" %}{% output_all bound_field.form_fields %}
 {% else %} {% output_all bound_field.form_fields %} {% endif %}
Index: core/meta/__init__.py
===================================================================
--- core/meta/__init__.py	(revision 2521)
+++ core/meta/__init__.py	(working copy)
@@ -828,6 +828,9 @@
                 func = curry(method_save_file, f)
                 func.alters_data = True
                 setattr(new_class, 'save_%s_file' % f.name, func)
+                func = curry(method_delete_file, f)
+                func.alters_data = True
+                setattr(new_class, 'delete_%s_file' % f.name, func)
                 if isinstance(f, ImageField):
                     # Add get_BLAH_width and get_BLAH_height methods, but only
                     # if the image field doesn't have width and height cache
@@ -1310,6 +1313,21 @@
     # Save the object, because it has changed.
     self.save()
 
+def method_delete_file(field, self):
+    filename = getattr(self, 'get_%s_filename' % field.name)()
+    #start of physical file removal logic
+    #you might want to comment out this block if you are accustomed
+    #the share one physical file/image among many objects
+    old_att_value = getattr(self, field.attname)
+    if old_att_value:
+        if os.path.exists(filename):
+            try: os.unlink(filename)
+            except: pass
+    #end of physical file removal logic
+    setattr(self, field.attname, '')
+    # Save the object, because it has changed.
+    self.save()
+
 # IMAGE FIELD METHODS ######################
 
 def method_get_image_width(field, self):
