0

我有模型CarSeat并且Seat有一个外键Car

在模型.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仅包含更改/添加的座位。不会出现未更改和已删除的席位(我希望包括未更改的席位)。

4

2 回答 2

1

使用ModelAdmin.save_related:方法。

于 2012-10-01T20:46:46.253 回答
0

Django 信号可能是您正在寻找的。 https://docs.djangoproject.com/en/dev/ref/signals/

于 2012-10-01T23:01:25.393 回答