Skip to content

Commit

Permalink
Fixed #30449 -- Fixed ordering of admin.RelatedFieldListFilter.
Browse files Browse the repository at this point in the history
Refactored admin.RelatedFieldListFilter and admin.RelatedOnlyFieldListFilter
to respect ordering defined in related model admin. Refactored
Field.get_choices to fallback to default model ordering.
  • Loading branch information
zeyneloz committed May 22, 2019
1 parent 2dc831d commit 6b01101
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions django/contrib/admin/filters.py
Expand Up @@ -193,11 +193,19 @@ def has_output(self):
def expected_parameters(self):
return [self.lookup_kwarg, self.lookup_kwarg_isnull]

def field_choices(self, field, request, model_admin):
def get_field_ordering(self, field, request, model_admin):
"""
Return the list of ordering fields for related field,
if related model admin has `ordering`.
"""
ordering = ()
related_admin = model_admin.admin_site._registry.get(field.remote_field.model)
if related_admin is not None:
ordering = related_admin.get_ordering(request)
return ordering

def field_choices(self, field, request, model_admin):
ordering = self.get_field_ordering(field, request, model_admin)
return field.get_choices(include_blank=False, ordering=ordering)

def choices(self, changelist):
Expand Down Expand Up @@ -419,4 +427,5 @@ def choices(self, changelist):
class RelatedOnlyFieldListFilter(RelatedFieldListFilter):
def field_choices(self, field, request, model_admin):
pk_qs = model_admin.get_queryset(request).distinct().values_list('%s__pk' % self.field_path, flat=True)
return field.get_choices(include_blank=False, limit_choices_to={'pk__in': pk_qs})
ordering = self.get_field_ordering(field, request, model_admin)
return field.get_choices(include_blank=False, limit_choices_to={'pk__in': pk_qs}, ordering=ordering)

0 comments on commit 6b01101

Please sign in to comment.