在Django的InlineModelAdmin中覆盖保存操作

23 浏览
0 Comments

在Django的InlineModelAdmin中覆盖保存操作

这个问题看起来可能与这个问题相似,但实际上并不相同...

我有一个模型结构如下:

class Customer(models.Model):
    ....
class CustomerCompany(models.Model):
    customer = models.ForeignKey(Customer)
    type = models.SmallIntegerField(....)

我正在使用InlineModels,并且有两种不同的CustomerCompany.type。因此,我为CustomerCompany定义了两个不同的内联,并重写了InlineModelAdmin.queryset方法。

class CustomerAdmin(admin.ModelAdmin):
    inlines=[CustomerCompanyType1Inline, CustomerCompanyType2Inline]
class CustomerCompanyType1Inline(admin.TabularInline):
    model = CustomerCompany
    def queryset(self, request):
        return super(CustomerCompanyType1Inline, self).queryset(request).filter(type=1)
class CustomerCompanyType2Inline(admin.TabularInline):
    model = CustomerCompany
    def queryset(self, request):
        return super(CustomerCompanyType2Inline, self).queryset(request).filter(type=2)

到目前为止,一切都很好,但是对于InlineModelAdmin的新记录添加,我仍然需要在AdminForm中显示CustomerCompanytype字段,因为我无法像这样重写InlineModelAdminsave方法:

class CustomerCompanyType2Inline(admin.TabularInline):
    model = CustomerCompany
    def queryset(self, request):
        return super(CustomerCompanyType2Inline, self).queryset(request).filter(type=2)
    #以下重写不起作用
    def save_model(self, request, obj, form, change):
        obj.type=2
        obj.save()

使用信号也不是一个解决方案,因为我的信号sender将是相同的Model,所以我无法检测到是哪个InlineModelAdmin发送的信号,以及应该是什么type

是否有一种方法可以在保存之前设置type字段?

0