Index: django/core/management.py
===================================================================
--- django/core/management.py	(revision 2747)
+++ django/core/management.py	(working copy)
@@ -897,7 +897,7 @@
                 else:
                     for fn in opts.admin.list_filter:
                         try:
-                            f = opts.get_field(fn)
+                            f = opts.get_field(fn.lstrip('-'))
                         except models.FieldDoesNotExist:
                             e.add(opts, '"admin.list_filter" refers to %r, which isn\'t a field.' % fn)
 
Index: django/contrib/admin/filterspecs.py
===================================================================
--- django/contrib/admin/filterspecs.py	(revision 2747)
+++ django/contrib/admin/filterspecs.py	(working copy)
@@ -11,18 +11,19 @@
 
 class FilterSpec(object):
     filter_specs = []
-    def __init__(self, f, request, params):
+    def __init__(self, f, exclude_filter, request, params):
         self.field = f
+        self.exclude_filter = exclude_filter
         self.params = params
 
     def register(cls, test, factory):
         cls.filter_specs.append( (test, factory) )
     register = classmethod(register)
 
-    def create(cls, f, request, params):
+    def create(cls, f, exclude_filter, request, params):
         for test, factory in cls.filter_specs:
             if test(f):
-                return factory(f, request, params)
+                return factory(f, exclude_filter, request, params)
     create = classmethod(create)
 
     def has_output(self):
@@ -42,19 +43,19 @@
             for choice in self.choices(cl):
                 t.append('<li%s><a href="%s">%s</a></li>\n' % \
                     ((choice['selected'] and ' class="selected"' or ''),
-                     choice['query_string'] ,
+                    (self.exclude_filter and join('-', choice['query_string']) or join('-', choice['query_string'])),
                      choice['display']))
             t.append('</ul>\n\n')
         return "".join(t)
 
 class RelatedFilterSpec(FilterSpec):
-    def __init__(self, f, request, params):
-        super(RelatedFilterSpec, self).__init__(f, request, params)
+    def __init__(self, f, exclude_filter, request, params):
+        super(RelatedFilterSpec, self).__init__(f, exclude_filter, request, params)
         if isinstance(f, models.ManyToManyField):
             self.lookup_title = f.rel.to._meta.verbose_name
         else:
             self.lookup_title = f.verbose_name
-        self.lookup_kwarg = '%s__%s__exact' % (f.name, f.rel.to._meta.pk.name)
+        self.lookup_kwarg = '%s%s__%s__exact' % (self.exclude_filter and '-' or '', f.name, f.rel.to._meta.pk.name)
         self.lookup_val = request.GET.get(self.lookup_kwarg, None)
         self.lookup_choices = f.rel.to._default_manager.all()
 
@@ -77,9 +78,9 @@
 FilterSpec.register(lambda f: bool(f.rel), RelatedFilterSpec)
 
 class ChoicesFilterSpec(FilterSpec):
-    def __init__(self, f, request, params):
-        super(ChoicesFilterSpec, self).__init__(f, request, params)
-        self.lookup_kwarg = '%s__exact' % f.name
+    def __init__(self, f, exclude_filter, request, params):
+        super(ChoicesFilterSpec, self).__init__(f, exclude_filter, request, params)
+        self.lookup_kwarg = '%s%s__exact' % (self.exclude_filter and '-' or '', f.name)
         self.lookup_val = request.GET.get(self.lookup_kwarg, None)
 
     def choices(self, cl):
@@ -94,9 +95,9 @@
 FilterSpec.register(lambda f: bool(f.choices), ChoicesFilterSpec)
 
 class DateFieldFilterSpec(FilterSpec):
-    def __init__(self, f, request, params):
-        super(DateFieldFilterSpec, self).__init__(f, request, params)
-
+    def __init__(self, f, exclude_filter, request, params):
+        super(DateFieldFilterSpec, self).__init__(f, exclude_filter, request, params)
+        
         self.field_generic = '%s__' % self.field.name
 
         self.date_params = dict([(k, v) for k, v in params.items() if k.startswith(self.field_generic)])
@@ -129,8 +130,11 @@
 FilterSpec.register(lambda f: isinstance(f, models.DateField), DateFieldFilterSpec)
 
 class BooleanFieldFilterSpec(FilterSpec):
-    def __init__(self, f, request, params):
-        super(BooleanFieldFilterSpec, self).__init__(f, request, params)
+    def __init__(self, f, exclude_filter, request, params):
+        
+
+
+        super(BooleanFieldFilterSpec, self).__init__(f, exclude_filter, request, params)
         self.lookup_kwarg = '%s__exact' % f.name
         self.lookup_kwarg2 = '%s__isnull' % f.name
         self.lookup_val = request.GET.get(self.lookup_kwarg, None)
Index: django/contrib/admin/views/main.py
===================================================================
--- django/contrib/admin/views/main.py	(revision 2747)
+++ django/contrib/admin/views/main.py	(working copy)
@@ -569,10 +569,10 @@
     def get_filters(self, request):
         filter_specs = []
         if self.lookup_opts.admin.list_filter and not self.opts.one_to_one_field:
-            filter_fields = [self.lookup_opts.get_field(field_name) \
+            filter_fields = [(self.lookup_opts.get_field(field_name.lstrip('-')), field_name.startswith('-')) \
                               for field_name in self.lookup_opts.admin.list_filter]
-            for f in filter_fields:
-                spec = FilterSpec.create(f, request, self.params)
+            for f, exclude_filter in filter_fields:
+                spec = FilterSpec.create(f, exclude_filter, request, self.params)
                 if spec and spec.has_output():
                     filter_specs.append(spec)
         return filter_specs, bool(filter_specs)
@@ -669,7 +669,16 @@
                 del lookup_params[i]
 
         # Apply lookup parameters from the query string.
-        qs = qs.filter(**lookup_params)
+        filter_params={}
+        exclude_params={}
+        for k, v in lookup_params.iteritems():
+            if k.startswith('-'):
+               exclude_params[k.lstrip('-')]=v
+            else:
+               filter_params[k]=v
+               
+        qs = qs.filter(**filter_params)
+        qs = qs.exclude(**exclude_params)
 
         # Use select_related() if one of the list_display options is a field
         # with a relationship.
