diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 2071792..0fe6bc4 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -662,6 +662,13 @@ class ModelAdmin(BaseModelAdmin):
             # Use only the first item in list_display as link
             return list(list_display)[:1]
 
+    def get_list_filter(self, request):
+        """
+        Returns a sequence containing the fields to be displayed as filters in 
+        the right sidebar of the changelist page.
+        """
+        return self.list_filter
+
     def construct_change_message(self, request, form, formsets):
         """
         Construct a change message from a changed object.
@@ -1112,6 +1119,7 @@ class ModelAdmin(BaseModelAdmin):
 
         list_display = self.get_list_display(request)
         list_display_links = self.get_list_display_links(request, list_display)
+        list_filter = self.get_list_filter(request)
 
         # Check actions to see if any are available on this changelist
         actions = self.get_actions(request)
@@ -1122,7 +1130,7 @@ class ModelAdmin(BaseModelAdmin):
         ChangeList = self.get_changelist(request)
         try:
             cl = ChangeList(request, self.model, list_display,
-                list_display_links, self.list_filter, self.date_hierarchy,
+                list_display_links, list_filter, self.date_hierarchy,
                 self.search_fields, self.list_select_related,
                 self.list_per_page, self.list_max_show_all, self.list_editable,
                 self)
diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt
index f3e39b9..03a07ed 100644
--- a/docs/ref/contrib/admin/index.txt
+++ b/docs/ref/contrib/admin/index.txt
@@ -1070,6 +1070,14 @@ templates used by the :class:`ModelAdmin` views:
     changelist that will be linked to the change view, as described in the
     :attr:`ModelAdmin.list_display_links` section.
 
+.. method:: ModelAdmin.get_list_filter(self, request)
+
+    .. versionadded:: 1.5
+
+    The ``get_list_filter`` is given the ``HttpRequest`` and is expected to
+    return a ``list`` or ``tuple`` of field names that will be used as filters
+    in the right sidebar of the changelist page.
+
 .. method:: ModelAdmin.get_urls(self)
 
     The ``get_urls`` method on a ``ModelAdmin`` returns the URLs to be used for
diff --git a/docs/releases/1.5.txt b/docs/releases/1.5.txt
index 51e64bd..ef93a78 100644
--- a/docs/releases/1.5.txt
+++ b/docs/releases/1.5.txt
@@ -60,6 +60,10 @@ Django 1.5 also includes several smaller improvements worth noting:
 * In the localflavor for Canada, "pq" was added to the acceptable codes for
   Quebec. It's an old abbreviation.
 
+* The filters in the changelist page of the admin interface can now be customized 
+  dependind on the request's context, by overriding the ModelAdmin.get_list_filter(self, request)
+  method.
+
 Backwards incompatible changes in 1.5
 =====================================
 
diff --git a/tests/regressiontests/admin_changelist/admin.py b/tests/regressiontests/admin_changelist/admin.py
index 9ecfbc6..5751d04 100644
--- a/tests/regressiontests/admin_changelist/admin.py
+++ b/tests/regressiontests/admin_changelist/admin.py
@@ -32,6 +32,7 @@ class ParentAdmin(admin.ModelAdmin):
 class ChildAdmin(admin.ModelAdmin):
     list_display = ['name', 'parent']
     list_per_page = 10
+    list_filter = ['parent', 'age']
 
     def queryset(self, request):
         return super(ChildAdmin, self).queryset(request).select_related("parent__name")
@@ -90,3 +91,14 @@ class SwallowAdmin(admin.ModelAdmin):
     list_display = ('origin', 'load', 'speed')
 
 site.register(Swallow, SwallowAdmin)
+
+class DynamicListFilterChildAdmin(admin.ModelAdmin):
+    list_filter = ('parent', 'name', 'age')
+
+    def get_list_filter(self, request):
+        my_list_filter = super(DynamicListFilterChildAdmin, self).get_list_filter(request)
+        if request.user.username == 'noparents':
+            my_list_filter = list(my_list_filter)
+            my_list_filter.remove('parent')
+        return my_list_filter
+
diff --git a/tests/regressiontests/admin_changelist/tests.py b/tests/regressiontests/admin_changelist/tests.py
index 62166ce..99a01d2 100644
--- a/tests/regressiontests/admin_changelist/tests.py
+++ b/tests/regressiontests/admin_changelist/tests.py
@@ -15,7 +15,7 @@ from .admin import (ChildAdmin, QuartetAdmin, BandAdmin, ChordsBandAdmin,
     GroupAdmin, ParentAdmin, DynamicListDisplayChildAdmin,
     DynamicListDisplayLinksChildAdmin, CustomPaginationAdmin,
     FilteredChildAdmin, CustomPaginator, site as custom_site,
-    SwallowAdmin)
+    SwallowAdmin, DynamicListFilterChildAdmin)
 from .models import (Event, Child, Parent, Genre, Band, Musician, Group,
     Quartet, Membership, ChordsMusician, ChordsBand, Invitation, Swallow,
     UnorderedObject, OrderedObject)
@@ -536,3 +536,31 @@ class ChangeListTests(TestCase):
         check_results_order()
         OrderedObjectAdmin.ordering = ['id', 'bool']
         check_results_order(ascending=True)
+
+    def test_dynamic_list_filter(self):
+        """
+        Regression tests for ticket #17646: dynamic list_filter support. 
+        """
+        parent = Parent.objects.create(name='parent')
+        for i in range(10):
+            Child.objects.create(name='child %s' % i, parent=parent)
+
+        user_noparents = self._create_superuser('noparents')
+        user_parents = self._create_superuser('parents')
+
+        # Test with user 'noparents'
+        m =  DynamicListFilterChildAdmin(Child, admin.site)
+        request = self._mocked_authenticated_request('/child/', user_noparents)
+        response = m.changelist_view(request)
+
+        list_filter = m.get_list_filter(request)
+        self.assertEqual(list_filter, ['name', 'age'])
+
+        # Test with user 'parents'
+        m = DynamicListFilterChildAdmin(Child, admin.site)
+        request = self._mocked_authenticated_request('/child/', user_parents)
+        response = m.changelist_view(request)
+
+        list_filter = m.get_list_filter(request)
+        self.assertEqual(list_filter, ('parent', 'name', 'age'))
+
