@@ -430,13 +430,14 @@ def get_inline_instances(self, request, obj=None):
430430 inlines = []
431431 for inline_class in inline_classes :
432432 inline = inline_class (self .model , self .admin_site )
433+ if hasattr (inline , "init_inline_dynamic" ):
434+ inline .init_inline_dynamic (request , obj )
433435 if request :
434436 if not inline .has_view_or_change_permission (request , obj ):
435437 continue
436438 if not inline .has_add_permission (request , obj ):
437439 inline .max_num = 0
438- if hasattr (inline , "init_inline_dynamic" ):
439- inline .init_inline_dynamic (request , obj )
440+ if hasattr (inline , "init_view_dynamic" ):
440441 inline .init_view_dynamic (request , request .request_data )
441442 inlines .append (inline )
442443 return inlines
@@ -754,27 +755,45 @@ def construct_change_message(self, request, form, formsets, add=False):
754755 elif form .changed_data :
755756 change_details = {}
756757 for field in form .changed_data :
757- initial_value = form .initial [field ]
758- new_value = form .cleaned_data [field ]
759- if isinstance (initial_value , int ): # Assuming the ID is an integer
760- field_model = form ._meta .model ._meta .get_field (
761- field
762- ).related_model
763- if field_model :
764- initial_value_repr = (
765- self ._get_object_repr_by_id (field_model , initial_value )
766- + f" ({ initial_value } )"
767- )
768- new_value_repr = str (new_value ) + f" ({ new_value .id } )"
758+ try :
759+ initial_value = form .initial [field ]
760+ new_value = form .cleaned_data [field ]
761+ if isinstance (initial_value , int ):
762+ field_model = form ._meta .model ._meta .get_field (
763+ field
764+ ).related_model
765+ if field_model :
766+ initial_value_repr = self ._get_object_repr_by_id (
767+ field_model , initial_value
768+ )
769+ new_value_repr = str (new_value )
770+ else :
771+ initial_value_repr = str (initial_value )
772+ new_value_repr = str (new_value )
769773 else :
770774 initial_value_repr = str (initial_value )
771775 new_value_repr = str (new_value )
772- else :
776+ except KeyError :
777+ initial_value = form .fields [field ].initial
778+ new_value = form .cleaned_data [field ]
773779 initial_value_repr = str (initial_value )
774780 new_value_repr = str (new_value )
775781 if initial_value_repr != new_value_repr :
776- change_details [field ] = (initial_value_repr , new_value_repr )
777- change_message .append ({"changed" : change_details })
782+ change_details [field ] = {
783+ "initial" : initial_value_repr ,
784+ "new" : new_value_repr ,
785+ "object_id" : (
786+ new_value .id if hasattr (new_value , "id" ) else ""
787+ ),
788+ "content_type_id" : (
789+ get_content_type_for_model (new_value ).pk
790+ if hasattr (new_value , "_meta" )
791+ else ""
792+ ),
793+ "object_name" : field ,
794+ }
795+ if change_details :
796+ change_message .append ({"changed" : change_details })
778797
779798 if formsets :
780799 with translation_override (None ):
@@ -789,25 +808,30 @@ def construct_change_message(self, request, form, formsets, add=False):
789808 )
790809 change_message .append (
791810 {
792- "added" : (
793- added_object ._meta .verbose_name ,
794- object_details ,
795- )
811+ "added" : {
812+ "initial" : None ,
813+ "new" : object_details ,
814+ "object_id" : (
815+ added_object .id if added_object .id else ""
816+ ),
817+ "content_type_id" : get_content_type_for_model (
818+ added_object
819+ ).pk ,
820+ "object_name" : added_object ._meta .verbose_name ,
821+ }
796822 }
797823 )
798824
799825 for form in formset .forms :
800826 if form .has_changed ():
801- changed_object = form . instance
802- if changed_object not in added_objects :
803- changed_details = {}
804- for field in form .changed_data :
805- if field != "DELETE" :
827+ changed_details = {}
828+ for field in form . changed_data :
829+ if field != "DELETE" :
830+ changed_object = form .instance
831+ if changed_object not in added_objects :
806832 initial_value = form .initial .get (field )
807833 new_value = form .cleaned_data [field ]
808- if isinstance (
809- initial_value , int
810- ): # Assuming the ID is an integer
834+ if isinstance (initial_value , int ):
811835 field_model = (
812836 formset .model ._meta .get_field (
813837 field
@@ -829,10 +853,19 @@ def construct_change_message(self, request, form, formsets, add=False):
829853 initial_value_repr = str (initial_value )
830854 new_value_repr = str (new_value )
831855 if initial_value_repr != new_value_repr :
832- changed_details [field ] = (
833- initial_value_repr ,
834- new_value_repr ,
835- )
856+ changed_details [field ] = {
857+ "initial" : initial_value_repr ,
858+ "new" : new_value_repr ,
859+ "object_id" : (
860+ new_value .id
861+ if hasattr (new_value , "id" )
862+ else ""
863+ ),
864+ "content_type_id" : get_content_type_for_model (
865+ new_value
866+ ).pk ,
867+ "object_name" : new_value ._meta .verbose_name ,
868+ }
836869 change_message .append (
837870 {"changed" : changed_details }
838871 )
@@ -841,13 +874,18 @@ def construct_change_message(self, request, form, formsets, add=False):
841874 change_message .append (
842875 {
843876 "deleted" : {
844- "name" : str (deleted_object ._meta .verbose_name ),
845- "object" : str (deleted_object ),
877+ "initial" : str (deleted_object ),
878+ "new" : None ,
879+ "object_id" : None ,
880+ "content_type_id" : get_content_type_for_model (
881+ deleted_object
882+ ).pk ,
883+ "object_name" : deleted_object ._meta .verbose_name ,
846884 }
847885 }
848886 )
849887 return change_message
850- except :
888+ except Exception as e :
851889 return super ().construct_change_message (request , form , formsets , add )
852890
853891 def _get_object_repr_by_id (self , model , object_id ):
0 commit comments