88from django .contrib .admin import TabularInline as BaseTabularInline
99from django .contrib .admin import display , helpers
1010from django .contrib .admin .utils import lookup_field
11+ from django .contrib .admin .widgets import RelatedFieldWidgetWrapper
1112from django .core .exceptions import ObjectDoesNotExist
1213from django .db import models
1314from django .db .models import (
3940from django .utils .text import capfirst
4041from django .utils .translation import gettext_lazy as _
4142from django .views import View
42- from unfold .utils import display_for_field
4343
4444from .checks import UnfoldModelAdminChecks
4545from .dataclasses import UnfoldAction
4646from .exceptions import UnfoldException
4747from .forms import ActionForm
4848from .settings import get_config
4949from .typing import FieldsetsType
50+ from .utils import display_for_field
5051from .widgets import (
5152 CHECKBOX_LABEL_CLASSES ,
52- INPUT_CLASSES ,
5353 LABEL_CLASSES ,
5454 SELECT_CLASSES ,
5555 UnfoldAdminBigIntegerFieldWidget ,
6262 UnfoldAdminMoneyWidget ,
6363 UnfoldAdminNullBooleanSelectWidget ,
6464 UnfoldAdminRadioSelectWidget ,
65+ UnfoldAdminSelect ,
6566 UnfoldAdminSingleDateWidget ,
6667 UnfoldAdminSingleTimeWidget ,
6768 UnfoldAdminSplitDateTimeWidget ,
@@ -142,6 +143,11 @@ class UnfoldAdminField(helpers.AdminField):
142143 def label_tag (self ) -> SafeText :
143144 classes = []
144145
146+ if not self .field .field .widget .__class__ .__name__ .startswith (
147+ "Unfold"
148+ ) and not self .field .field .widget .template_name .startswith ("unfold" ):
149+ return super ().label_tag ()
150+
145151 # TODO load config from current AdminSite (override Fieldline.__iter__ method)
146152 for lang , flag in get_config ()["EXTENSIONS" ]["modeltranslation" ][
147153 "flags"
@@ -175,6 +181,9 @@ def label_tag(self) -> SafeText:
175181
176182class UnfoldAdminReadonlyField (helpers .AdminReadonlyField ):
177183 def label_tag (self ) -> SafeText :
184+ if not isinstance (self .model_admin , ModelAdmin ):
185+ return super ().label_tag ()
186+
178187 attrs = {
179188 "class" : " " .join (LABEL_CLASSES + ["mb-2" ]),
180189 }
@@ -285,9 +294,7 @@ def formfield_for_choice_field(
285294 radio_style = self .radio_fields [db_field .name ]
286295 )
287296 else :
288- kwargs ["widget" ] = forms .Select (
289- attrs = {"class" : " " .join (SELECT_CLASSES )}
290- )
297+ kwargs ["widget" ] = UnfoldAdminSelect ()
291298
292299 kwargs ["choices" ] = db_field .get_choices (
293300 include_blank = db_field .blank , blank_choice = [("" , _ ("Select value" ))]
@@ -301,16 +308,12 @@ def formfield_for_foreignkey(
301308 # Overrides widgets for all related fields
302309 if "widget" not in kwargs :
303310 if db_field .name in self .raw_id_fields :
304- kwargs ["widget" ] = forms .TextInput (
305- attrs = {"class" : " " .join (INPUT_CLASSES )}
306- )
311+ kwargs ["widget" ] = UnfoldAdminTextInputWidget ()
307312 elif (
308313 db_field .name not in self .get_autocomplete_fields (request )
309314 and db_field .name not in self .radio_fields
310315 ):
311- kwargs ["widget" ] = forms .Select (
312- attrs = {"class" : " " .join (SELECT_CLASSES )}
313- )
316+ kwargs ["widget" ] = UnfoldAdminSelect ()
314317 kwargs ["empty_label" ] = _ ("Select value" )
315318
316319 return super ().formfield_for_foreignkey (db_field , request , ** kwargs )
@@ -323,9 +326,7 @@ def formfield_for_manytomany(
323326 ) -> ModelMultipleChoiceField :
324327 if "widget" not in kwargs :
325328 if db_field .name in self .raw_id_fields :
326- kwargs ["widget" ] = forms .TextInput (
327- attrs = {"class" : " " .join (INPUT_CLASSES )}
328- )
329+ kwargs ["widget" ] = UnfoldAdminTextInputWidget ()
329330
330331 form_field = super ().formfield_for_manytomany (db_field , request , ** kwargs )
331332
@@ -342,9 +343,7 @@ def formfield_for_nullboolean_field(
342343 self , db_field : Field , request : HttpRequest , ** kwargs
343344 ) -> Optional [Field ]:
344345 if "widget" not in kwargs :
345- kwargs ["widget" ] = forms .NullBooleanSelect (
346- attrs = {"class" : " " .join (SELECT_CLASSES )}
347- )
346+ kwargs ["widget" ] = UnfoldAdminNullBooleanSelectWidget ()
348347
349348 return db_field .formfield (** kwargs )
350349
@@ -354,7 +353,14 @@ def formfield_for_dbfield(
354353 if isinstance (db_field , models .BooleanField ) and db_field .null is True :
355354 return self .formfield_for_nullboolean_field (db_field , request , ** kwargs )
356355
357- return super ().formfield_for_dbfield (db_field , request , ** kwargs )
356+ formfield = super ().formfield_for_dbfield (db_field , request , ** kwargs )
357+
358+ if formfield and isinstance (formfield .widget , RelatedFieldWidgetWrapper ):
359+ formfield .widget .template_name = (
360+ "unfold/widgets/related_widget_wrapper.html"
361+ )
362+
363+ return formfield
358364
359365
360366class ModelAdmin (ModelAdminMixin , BaseModelAdmin ):
@@ -546,7 +552,8 @@ def changeform_view(
546552 "title" : action .description ,
547553 "attrs" : action .method .attrs ,
548554 "path" : reverse (
549- f"admin:{ action .action_name } " , args = (object_id ,)
555+ f"{ self .admin_site .name } :{ action .action_name } " ,
556+ args = (object_id ,),
550557 ),
551558 }
552559 )
@@ -570,7 +577,7 @@ def changelist_view(
570577 {
571578 "title" : action .description ,
572579 "attrs" : action .method .attrs ,
573- "path" : reverse (f"admin :{ action .action_name } " ),
580+ "path" : reverse (f"{ self . admin_site . name } :{ action .action_name } " ),
574581 }
575582 for action in self .get_actions_list (request )
576583 ]
@@ -579,7 +586,7 @@ def changelist_view(
579586 {
580587 "title" : action .description ,
581588 "attrs" : action .method .attrs ,
582- "raw_path" : f"admin :{ action .action_name } " ,
589+ "raw_path" : f"{ self . admin_site . name } :{ action .action_name } " ,
583590 }
584591 for action in self .get_actions_row (request )
585592 ]
0 commit comments