我试图学习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 ;按钮,这是错的吗?
答案 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})