在请求POST中访问原始数据

时间:2014-11-10 13:21:16

标签: django django-forms django-views

使用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。我不想要这个。

知道如何优雅地解决这个问题吗?

2 个答案:

答案 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"
...