在管理界面中捕获模型对象不变

时间:2012-10-01 17:35:49

标签: python django django-models django-admin

我有模型CarSeatSeatCar的外键。

在models.py中:

class Car(models.Model):
    # ...

class Seat(models.Model):
    car = models.ForeignKey(Car)
    # ...

在管理界面中,添加/更换汽车时可以将座位添加到汽车中(使用内联字段)。

在admin.py中:

class CarAdmin(admin.ModelAdmin):
    # ...
    inlines = [SeatInline]

class SeatInline(admin.StackedInline):
    model = Seat
    extra = 1

当用户通过CarAdmin添加/更改/删除汽车或添加/更改/删除座位时,我需要记录他所做的事情,因此需要比较更改前后的所有座位

问题是:

如何获取两个座位对象列表seats_beforeseats_after以便进行比较?这需要在我可以访问request.user的地方完成。

我尝试在save_formset()中执行此操作,但它不起作用。其中一个问题是:要获得seats_after,显然只能获得已修改的座位列表,即无法在未更改的座位和已删除的座位之间做出区别。

def save_formset(self, request, form, formset, change):

    # ...
    instances = formset.save(commit=False)
    seats_after = []
    for instance in instances:
        if isinstance(instance, Seat):
            seats_after.append(instance) # Unchanged seats are not added here
    # ...

我也很难在此功能中获得seats_before

编辑:

根据defuz的建议,我尝试了这段代码:

def save_related(self, request, form, formsets, change):

    car_before = form.save(commit=False)
    seats_before = car_before.seats_set.all()

    form.save_m2m()

    seats_after = []
    for formset in formsets:
        instances = formset.save()
        for instance in instances:
            if isinstance(instance, Seat):
                seats_after.append(instance)

在这个例子中有两个问题:

  1. seats_before似乎包含新席位而不是旧席位,就像在保存表单时保存相关对象一样。

  2. seats_after仅包含已更改/已添加的席位。未出现未更改和删除的座位(我希望包含未更改的座位)。

2 个答案:

答案 0 :(得分:1)

使用ModelAdmin.save_related:方法。

答案 1 :(得分:0)

Django信号可能就是你要找的东西。 https://docs.djangoproject.com/en/dev/ref/signals/