El administrador de Django no guarda los campos en línea ya rellenados que se dejan en su estado inicial

Tengo un código de administrador personalizado que inicializa algunos objetos secundarios en línea.

Si el usuario edita uno de los valores predeterminados del objeto secundario en línea, ese elemento secundario se crea cuando se guarda el objeto principal.

Supongo que Django está comprobando si los valores han cambiado de sus valores initial y solo está guardando si el usuario ha cambiado un valor.

¿Es este el caso?

¿Cómo puedo obligar a Django Admin a crear objetos secundarios en línea con sus valores predeterminados sin cambios, si el usuario elige no cambiar los valores predeterminados?

 class PrepopIpInlineFormSet(forms.models.BaseInlineFormSet): model = Ip def __init__(self, *args, **kwargs): super(PrepopIpInlineFormSet, self).__init__(*args, **kwargs) initial = # calculate a set of default Ip model initial values self.initial = initial class PrepopIpInline(admin.options.InlineModelAdmin): template = "admin/linked.html" model = Ip formset = PrepopIpInlineFormSet fk_name = 'sim' admin_model_path = None show_url = True def __init__(self, *args): super(PrepopIpInline, self).__init__(*args) if self.admin_model_path is None: self.admin_model_path = self.model.__name__.lower() def get_formset(self, request, obj=None, **kwargs): formset = super(PrepopIpInline, self).get_formset(request, obj, **kwargs) formset.request = request return formset def get_extra(self, request, obj=None, **kwargs): if obj: return 0 else: return ApnGgsn.objects.all().count() 

Origen: ¿Cómo forzar-guardar un django admin en línea “vacío” / sin cambios?

 from django.contrib import admin from django.forms.models import BaseInlineFormSet, ModelForm class AlwaysChangedModelForm(ModelForm): def has_changed(self): """ Should returns True if data differs from initial. By always returning true even unchanged inlines will get validated and saved.""" return True class CheckerInline(admin.StackedInline): """ Base class for checker inlines """ extra = 0 form = AlwaysChangedModelForm 

En el objeto ModelAdmin en sí, podría super el método save_related. Luego, una vez que se haya completado, verifique la existencia de esos modelos. Si no existen, créalos. Se vería algo como esto:

 class ParentObjectAdmin(admin.ModelAdmin): def save_related(self, request, form, formsets, change): super(ParentObjectAdmin, self).save_related(request, form, formsets, change) obj = form.instance if form.is_valid() and not ChildObject.objects.filter(parent = obj).exists(): ChildObject.objects.create(name = ChildObject.default_name, parent = obj, ...) 

Revelación completa: no puedo recordar si (en el caso de un ParentObject recién creado) si el atributo form.instance se completará o no. Sé que el objeto subyacente se habrá creado en ese punto (porque se llama a save_model antes que a save_related).

Si lo que propongo con “obj = form.instance” no funciona, también puede obtener ese nuevo objeto al realizar una consulta basada en valores únicos en los datos de su formulario.

Por ejemplo, en lugar de obj = form.instance, haga:

 obj = ParentObject.objects.get(username = form.cleaned_data.get("username"))