我有模型Car
和Seat
,Seat
有Car
的外键。
在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_before
和seats_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)
在这个例子中有两个问题:
seats_before
似乎包含新席位而不是旧席位,就像在保存表单时保存相关对象一样。
seats_after
仅包含已更改/已添加的席位。未出现未更改和删除的座位(我希望包含未更改的座位)。
答案 0 :(得分:1)
答案 1 :(得分:0)
Django信号可能就是你要找的东西。 https://docs.djangoproject.com/en/dev/ref/signals/