如何强制Django Admin保存内联?

时间:2017-08-23 19:30:43

标签: python django django-admin inline

我有一个使用Django内联管理员的应用程序。

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)

由于我无法控制的原因,在MyClass和MyInlineClass中重复了fieldN。

因此,用户必须更改MyClass和每个内联上的fieldN。

我希望在更改管理类的字段N时在内联中保存fieldN。

from django.contrib import admin

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

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

如果我覆盖MyClass保存方法,我怎么能强制调用MyInlineClass保存方法?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我已经解决了覆盖MyClass的保存方法的问题:

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)