diff options
| author | Juan Pedro Fisanotti <fisadev@gmail.com> | 2013-02-23 15:02:01 -0300 |
|---|---|---|
| committer | Ramiro Morales <cramm0@gmail.com> | 2013-03-04 18:08:53 -0300 |
| commit | d9330d5be2ee60b208dcab2616eb164ea2e6bf36 (patch) | |
| tree | 576f70d784d3ac01e72f7f5aad48704ffb59d249 /django | |
| parent | 3ea0c7d35ac461cb469170486683d10732eb534b (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.py | 21 |
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): |
