From eb7b8f3699fbe5ad6aaafb264355741648fdd5e4 Mon Sep 17 00:00:00 2001 From: Ankur Date: Mon, 27 Jun 2022 07:58:07 +0545 Subject: [PATCH] Fixed #33805 -- Made admin's many-to-many widgets do not display help text for selecting values when allow_multiple_selected is False. --- django/contrib/admin/options.py | 8 ++++++-- tests/admin_widgets/tests.py | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index a25814b5fb7..f959a8dc484 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -314,8 +314,12 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass): kwargs["queryset"] = queryset form_field = db_field.formfield(**kwargs) - if isinstance(form_field.widget, SelectMultiple) and not isinstance( - form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple) + if ( + isinstance(form_field.widget, SelectMultiple) + and form_field.widget.allow_multiple_selected + and not isinstance( + form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple) + ) ): msg = _( "Hold down “Control”, or “Command” on a Mac, to select more than one." diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py index cce759a9c87..5f8584a4350 100644 --- a/tests/admin_widgets/tests.py +++ b/tests/admin_widgets/tests.py @@ -273,6 +273,26 @@ class AdminFormfieldForDBFieldTests(SimpleTestCase): "Hold down “Control”, or “Command” on a Mac, to select more than one.", ) + def test_m2m_widgets_no_allow_multiple_selected(self): + class NoAllowMultipleSelectedWidget(forms.SelectMultiple): + allow_multiple_selected = False + + class AdvisorAdmin(admin.ModelAdmin): + filter_vertical = ["companies"] + formfield_overrides = { + ManyToManyField: {"widget": NoAllowMultipleSelectedWidget}, + } + + self.assertFormfield( + Advisor, + "companies", + widgets.FilteredSelectMultiple, + filter_vertical=["companies"], + ) + ma = AdvisorAdmin(Advisor, admin.site) + f = ma.formfield_for_dbfield(Advisor._meta.get_field("companies"), request=None) + self.assertEqual(f.help_text, "") + @override_settings(ROOT_URLCONF="admin_widgets.urls") class AdminFormfieldForDBFieldWithRequestTests(TestDataMixin, TestCase):