Skip to content

Commit 0be1c45

Browse files
JaeHyuckSasarahboyce
authored andcommitted
Fixed #34624 -- Removed change, delete, and view buttons for non-Select widgets in RelatedFieldWidgetWrapper.
Signed-off-by: SaJH <wogur981208@gmail.com>
1 parent 550822b commit 0be1c45

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

django/contrib/admin/widgets.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.core.exceptions import ValidationError
1111
from django.core.validators import URLValidator
1212
from django.db.models import CASCADE, UUIDField
13+
from django.forms.widgets import Select
1314
from django.urls import reverse
1415
from django.urls.exceptions import NoReverseMatch
1516
from django.utils.html import smart_urlquote
@@ -284,16 +285,18 @@ def __init__(
284285
if can_add_related is None:
285286
can_add_related = admin_site.is_registered(rel.model)
286287
self.can_add_related = can_add_related
287-
# XXX: The UX does not support multiple selected values.
288-
multiple = getattr(widget, "allow_multiple_selected", False)
289288
if not isinstance(widget, AutocompleteMixin):
290289
self.attrs["data-context"] = "available-source"
291-
self.can_change_related = not multiple and can_change_related
290+
# Only single-select Select widgets are supported.
291+
supported = not getattr(
292+
widget, "allow_multiple_selected", False
293+
) and isinstance(widget, Select)
294+
self.can_change_related = supported and can_change_related
292295
# XXX: The deletion UX can be confusing when dealing with cascading
293296
# deletion.
294297
cascade = getattr(rel, "on_delete", None) is CASCADE
295-
self.can_delete_related = not multiple and not cascade and can_delete_related
296-
self.can_view_related = not multiple and can_view_related
298+
self.can_delete_related = supported and not cascade and can_delete_related
299+
self.can_view_related = supported and can_view_related
297300
# To check if the related object is registered with this AdminSite.
298301
self.admin_site = admin_site
299302
self.use_fieldset = True

tests/admin_widgets/tests.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,21 @@ def test_data_model_ref_when_model_name_is_camel_case(self):
978978
"""
979979
self.assertHTMLEqual(output, expected)
980980

981+
def test_non_select_widget_cant_change_delete_related(self):
982+
main_band = Event._meta.get_field("main_band")
983+
widget = widgets.AdminRadioSelect()
984+
wrapper = widgets.RelatedFieldWidgetWrapper(
985+
widget,
986+
main_band,
987+
widget_admin_site,
988+
can_add_related=True,
989+
can_change_related=True,
990+
can_delete_related=True,
991+
)
992+
self.assertTrue(wrapper.can_add_related)
993+
self.assertFalse(wrapper.can_change_related)
994+
self.assertFalse(wrapper.can_delete_related)
995+
981996

982997
@override_settings(ROOT_URLCONF="admin_widgets.urls")
983998
class AdminWidgetSeleniumTestCase(AdminSeleniumTestCase):

0 commit comments

Comments
 (0)