summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2013-11-21 22:18:52 +0100
committerClaude Paroz <claude@2xlibre.net>2013-11-21 22:24:00 +0100
commit9cbcd06b1adf5a505646f30898c3370d1c4ab726 (patch)
tree6cf248e320f64422c032f6dd9adb804f769c8c34
parent5730bf281922151f211a2509dd8b493230d6a187 (diff)
[1.6.x] Fixed #21405 -- Prevented queryset overwrite in BaseModelAdmin
Thanks guido@20tab.com for the report and Tim Graham for the analyze. Backport of 1718b5256c from master.
-rw-r--r--django/contrib/admin/options.py14
-rw-r--r--docs/releases/1.6.1.txt2
-rw-r--r--tests/admin_ordering/tests.py22
3 files changed, 32 insertions, 6 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index a841ee30b9..9dddcb0dfb 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -209,9 +209,10 @@ class BaseModelAdmin(six.with_metaclass(RenameBaseModelAdminMethods)):
})
kwargs['empty_label'] = _('None') if db_field.blank else None
- queryset = self.get_field_queryset(db, db_field, request)
- if queryset is not None:
- kwargs['queryset'] = queryset
+ if not 'queryset' in kwargs:
+ queryset = self.get_field_queryset(db, db_field, request)
+ if queryset is not None:
+ kwargs['queryset'] = queryset
return db_field.formfield(**kwargs)
@@ -232,9 +233,10 @@ class BaseModelAdmin(six.with_metaclass(RenameBaseModelAdminMethods)):
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
+ if not 'queryset' in kwargs:
+ queryset = self.get_field_queryset(db, db_field, request)
+ if queryset is not None:
+ kwargs['queryset'] = queryset
return db_field.formfield(**kwargs)
diff --git a/docs/releases/1.6.1.txt b/docs/releases/1.6.1.txt
index d7f73903ff..db05bcdca2 100644
--- a/docs/releases/1.6.1.txt
+++ b/docs/releases/1.6.1.txt
@@ -28,3 +28,5 @@ Bug fixes
non related to file extensions (#21457).
* Fixed display of inline instances in formsets when parent has 0 for primary
key (#21472).
+* Fixed a regression where custom querysets for foreign keys were overwritten
+ if ``ModelAdmin`` had ordering set (#21405).
diff --git a/tests/admin_ordering/tests.py b/tests/admin_ordering/tests.py
index 6655ad37ad..083c053d66 100644
--- a/tests/admin_ordering/tests.py
+++ b/tests/admin_ordering/tests.py
@@ -148,6 +148,28 @@ class TestRelatedFieldsAdminOrdering(TestCase):
# should be ordered by rank (defined by the ModelAdmin)
self.check_ordering_of_field_choices([self.b1, self.b2])
+ def test_custom_queryset_still_wins(self):
+ """Test that custom queryset has still precedence (#21405)"""
+ class SongAdmin(admin.ModelAdmin):
+ # Exclude one of the two Bands from the querysets
+ def formfield_for_foreignkey(self, db_field, **kwargs):
+ if db_field.name == 'band':
+ kwargs["queryset"] = Band.objects.filter(rank__gt=2)
+ return super(SongAdmin, self).formfield_for_foreignkey(db_field, **kwargs)
+ def formfield_for_manytomany(self, db_field, **kwargs):
+ if db_field.name == 'other_interpreters':
+ kwargs["queryset"] = Band.objects.filter(rank__gt=2)
+ return super(SongAdmin, self).formfield_for_foreignkey(db_field, **kwargs)
+
+ class StaticOrderingBandAdmin(admin.ModelAdmin):
+ ordering = ('rank',)
+
+ admin.site.unregister(Song)
+ admin.site.register(Song, SongAdmin)
+ admin.site.register(Band, StaticOrderingBandAdmin)
+
+ self.check_ordering_of_field_choices([self.b2])
+
def tearDown(self):
admin.site.unregister(Song)
if Band in admin.site._registry: