summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJuan Pedro Fisanotti <fisadev@gmail.com>2013-02-23 15:02:01 -0300
committerRamiro Morales <cramm0@gmail.com>2013-03-04 18:08:53 -0300
commitd9330d5be2ee60b208dcab2616eb164ea2e6bf36 (patch)
tree576f70d784d3ac01e72f7f5aad48704ffb59d249 /django
parent3ea0c7d35ac461cb469170486683d10732eb534b (diff)
Fixed #6585 -- Admin relationship widgets: Respect ordering defined by target model's ModelAdmin.
Thanks Gary Wilson for the report and Juan Pedro Fisanotti, Carlos Matías de la Torre for the fix.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/admin/options.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 8f78aaf8dd..cce92c6a95 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -157,6 +157,19 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)):
)
return db_field.formfield(**kwargs)
+ def get_field_queryset(self, db, db_field, request):
+ """
+ If the ModelAdmin specifies ordering, the queryset should respect that
+ ordering. Otherwise don't specify the queryset, let the field decide
+ (returns None in that case).
+ """
+ related_admin = self.admin_site._registry.get(db_field.rel.to, None)
+ if related_admin is not None:
+ ordering = related_admin.get_ordering(request)
+ if ordering is not None and ordering != ():
+ return db_field.rel.to._default_manager.using(db).order_by(*ordering).complex_filter(db_field.rel.limit_choices_to)
+ return None
+
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
"""
Get a form Field for a ForeignKey.
@@ -171,6 +184,10 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)):
})
kwargs['empty_label'] = db_field.blank and _('None') or None
+ queryset = self.get_field_queryset(db, db_field, request)
+ if queryset is not None:
+ kwargs['queryset'] = queryset
+
return db_field.formfield(**kwargs)
def formfield_for_manytomany(self, db_field, request=None, **kwargs):
@@ -190,6 +207,10 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)):
elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)):
kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical))
+ queryset = self.get_field_queryset(db, db_field, request)
+ if queryset is not None:
+ kwargs['queryset'] = queryset
+
return db_field.formfield(**kwargs)
def _declared_fieldsets(self):