使用Django 1.7。 在基于函数的视图中,我正在尝试获取当前(即尚未更新)实例的数据,以便比较我需要采取的操作。
当我尝试使用smt.field1
获取数据时,我希望得到我在数据库中为此实例提供的内容,而是获取表单中新的未保存数据。
def edit_something(request, pk):
smt = get_object_or_404(Something, pk=pk)
if request.method == 'POST':
form = MyForm(instance=smt, data=request.POST)
context_dict['form'] = form
if form.is_valid():
if smt.field1 != form.cleaned_data.get('field1'):
print "field1 has changed, so I need to do Action1"
else:
print "field1 has not changed, so I need to do Action2"
form.instance.modified_by = request.user
form.save()
return HttpResponseRedirect(reverse('smt_detail', args=(smt.id,)))
else:
...
换句话说,smt.field1 == form.cleaned_data.get('field1')
将始终产生True
,并且将始终采用Action1。我不想要这个。
知道如何优雅地解决这个问题吗?
答案 0 :(得分:2)
您需要使用form.changed_data来获取已更新的字段。
答案 1 :(得分:0)
调用smt
时,if form.is_valid():
的实例会发生变化。
一种解决方案是在调用form.is_valid()之前获取smt.field1变量,例如
...
form = MyForm(instance=smt, data=request.POST)
context_dict['form'] = form
orig_field1 = smt.field1
if form.is_valid():
if orig_field1 != form.cleaned_data.get('field1'):
print "field1 has changed, so I need to do Action1"
else:
print "field1 has not changed, so I need to do Action2"
...