Search code examples
pythondjangodjango-admininline

How to force Django Admin to save the inline?


I have an app who uses Django Inline Admin.

from django.db import models

class MyClass(models.Model):
    field1 = models.CharField(max_length=128)
    fieldN = models.IntegerField()

class MyInlineClass(models.Model):
    field1 = models.CharField(max_length=128)
    field2 = models.ForeignKey(MyClass)
    fieldN = models.IntegerField()

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        if self.field2:
            self.field1 = self.field2.field1
        return BaseModel.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)

For reasons beyond my control, the fieldN is repeated in MyClass and in MyInlineClass.

So the user has to change the fieldN on MyClass and on eachone of the inlines.

I want to save fieldN on the inline when changing fieldN on my admin class.

from django.contrib import admin

class MyInlineClassInline(admin.TabularInline):
    model = MyInlineClass
    fields = ['field2']

class MyClassAdmin(admin.ModelAdmin):
    inlines = [MyInlineClassInline,]

If I override the MyClass save method, how could I force to call MyInlineClass save method also?

Any thoughts?


Solution

  • I've solved overriding the save method of MyClass like this:

    class MyClass(BaseModel):
    field1 = models.CharField(max_length=128)
    fieldN = models.IntegerField()
    
    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        BaseModel.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
        if (MyInlineClass.objects.filter(field2=self.pk).first()):
            for myinlineclass in MyInlineClass.objects.filter(field2=self.pk):
                MyInlineClass.save(myinlineclass, force_insert, force_update, using, update_fields)
        return BaseModel.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)