无法弄清楚为什么form.has_changed()总是如此?

时间:2017-07-02 19:33:27

标签: django django-forms

我试图学习Django,并想出了一个我无法弄清楚的情况。我有以下代码:

def contact_add(request):
if request.method == 'POST':
    form = ContactManageForm(request.POST)
    if form.is_valid():
        if form.has_changed(): # <-- ALWAYS RETURNS TRUE!
            form.clean()
            ...

elif 'id' in request.GET:  # Request to show an existing contact
    new_contact_dynamic = contacts.models.PersonDynamic.objects.get(person_static = request.GET['id'],
                                                                    current_record_fg = True)
    form = ContactManageForm(new_contact_dynamic.__dict__, initial=new_contact_dynamic.__dict__)

else:  # This must be to add a new contact
    form = ContactAddForm()

return render(request, 'contact_manage.html', {'form': form})

因此,如果我发送了身份证号码,我会读取一条记录并将其显示在屏幕上。我的模板为用户提供了“提交更改”功能。按钮。如上所述,我的问题是Django总是显示表单已经改变,即使用户没有改变屏幕上的任何数据(即他只是点击提交更改按钮而不改变任何内容)。

那么,我在代码中做了一些明显错误的事情,是否会造成这种情况?我是否误解了form.has_changed()方法是如何工作的?

我的假设是当我在GET请求之后使用initial=参数时,Django会在某处存储该数据,并在用户点击提交数据时知道上下文&#39 ;按钮,这是错的吗?

1 个答案:

答案 0 :(得分:2)

是的,您需要使用initial数据初始化您的表单。 在您的视图中,GET和POST请求没有共同的上下文。您可能希望使用sessions

但在这种情况下,没有必要。您可以在每个请求中检索实例:

def contact_add(request):
    if 'id' in request.GET:
        new_contact_dynamic = contacts.models.PersonDynamic.objects.get(
            person_static = request.GET['id'],
            current_record_fg = True
        )
        if request.method == 'POST':
            form = ContactManageForm(request.POST, initial=new_contact_dynamic.__dict__)
            ...
        else: # Show an existing contact
            form = ContactManageForm(initial=new_contact_dynamic.__dict__)
    else:
        form = ContactAddForm()

    return render(request, 'contact_manage.html', {'form': form})