@@ -830,6 +830,55 @@ class BandAdmin(ModelAdmin):
830830 ["extra" , "transport" , "id" , "DELETE" , "main_band" ],
831831 )
832832
833+ def test_foreign_key_as_custom_widget (self ):
834+ class CustomSelectMultiple (forms .SelectMultiple ):
835+ def build_attrs (self , base_attrs , extra_attrs = None ):
836+ attrs = super ().build_attrs (base_attrs , extra_attrs )
837+ attrs ["data-custom-widget" ] = "true"
838+ return attrs
839+
840+ class ConcertAdmin (ModelAdmin ):
841+ formfield_overrides = {
842+ models .ForeignKey : {"widget" : CustomSelectMultiple },
843+ }
844+
845+ cma = ConcertAdmin (Concert , self .site )
846+ cmafa = cma .get_form (request )
847+ expected = (
848+ '<div><label for="id_main_band">Main band:</label><div '
849+ 'class="related-widget-wrapper" data-model-ref="band"><select '
850+ 'name="main_band" data-context="available-source" required '
851+ 'id="id_main_band" data-custom-widget="true" multiple>'
852+ '<option value="">---------</option><option value="1">The Doors</option>'
853+ "</select></div></div>"
854+ )
855+ self .assertInHTML (expected , cmafa ().render ())
856+
857+ def test_foreign_key_as_custom_widget_with_fieldset (self ):
858+ class CustomSelectMultipleFieldset (forms .RadioSelect ):
859+ use_fieldset = True
860+
861+ def build_attrs (self , base_attrs , extra_attrs = None ):
862+ attrs = super ().build_attrs (base_attrs , extra_attrs )
863+ attrs ["use_fieldset" ] = "true"
864+ return attrs
865+
866+ class ConcertAdmin (ModelAdmin ):
867+ formfield_overrides = {
868+ models .ForeignKey : {"widget" : CustomSelectMultipleFieldset },
869+ }
870+
871+ cma = ConcertAdmin (Concert , self .site )
872+ cmafa = cma .get_form (request )
873+ expected = (
874+ '<fieldset><legend>Main band:</legend><div class="related-widget-wrapper" '
875+ 'data-model-ref="band"><div id="id_main_band"><div><label '
876+ 'for="id_main_band_0"><input type="radio" name="main_band" value="1" '
877+ 'data-context="available-source" required id="id_main_band_0" '
878+ 'use_fieldset="true">The Doors</label></div></div></div></fieldset>'
879+ )
880+ self .assertInHTML (expected , cmafa ().render ())
881+
833882 def test_log_actions (self ):
834883 ma = ModelAdmin (Band , self .site )
835884 mock_request = MockRequest ()
0 commit comments