Django:form.is_valid()错误,但仅在"if request.method == 'POST'"之后?



当我在if request.method == 'POST'之前print(formexam)时,它会显示适当填写的表格项目(考试是以前创建的,现在我只是更新它以根据需要进行更改(。

然而,当我在if request.method == 'POST'之后print(formexam)时,它显示表单字段(至少有几个字段,我没有查看每个字段(为空。是什么导致了这种情况?

(在下面的示例代码中,我打印的是错误而不是表单。(

此外,一个非常相似的views.py函数(changeExam,本文底部(也可以正常工作。

谢谢!


视图.py

def updateExam(request, pk):
exam = Exam.objects.get(id=pk)
formod = form_od.ODForm(instance=exam.od)
formos = form_os.OSForm(instance=exam.os)
formexam = ExamForm(instance=exam)
print(f'The errors are: {formexam.errors}')
if request.method == 'POST':
formexam = ExamForm(request.POST, instance=exam)
print(f'The errors are: {formexam.errors}')
formod = form_od.ODForm(request.POST, instance=exam.od)
formos = form_os.OSForm(request.POST, instance=exam.os)
if formod.is_valid() and formos.is_valid():
print("these are valid")
if formexam.is_valid():
print("so is this one.")
#save exam
instance = formexam.save(commit=False)
instance.save()
#save OD
instance = formod.save(commit=False)
instance.save()
#save OS
instance = formos.save(commit=False)
instance.save()
else:
print("Exam form not valid.")
#save OD
instance = formod.save(commit=False)
instance.save()
#save OS
instance = formos.save(commit=False)
instance.save()
else:
print("No forms are valid.")

context = {
'formod': formod,
'formos': formos,
'formexam': formexam,
'exam': exam,
}
return render(request, 'accounts/form_exam_update.html', context)

点击提交按钮的结果:

The errors are: 
The errors are: <ul class="errorlist"><li>doctor<ul class="errorlist">.<li>This field is required.</li></ul></li><li>examtype<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
these are valid
Exam form not valid.

然而,这种非常相似的方法有效:视图.py

def changeExam(request, pk):
exam = Exam.objects.get(id=pk)
form = ExamForm(instance=exam)
if request.method == 'POST':
form = ExamForm(request.POST, instance=exam)
if form.is_valid():
print(form)
form.save()
next = request.POST.get('next', '/')
return HttpResponseRedirect(next)
context = {
'form': form,
}
return render(request, 'accounts/form_exam.html', context)def 

想明白了!

changeExam上,生成的HTML页面(form_exam.HTML(具有<form>标记以及<form>标记中的所有字段。因此,没有错误。

updateExam上,它是一个更大的页面(form_exam_update.html(,使用Django模板标签在不同的部分中包含内容,我意识到一些字段(例如doctor、examtype(在<form>标签之外。

我更新了HTML代码,使所有相应的字段都在<form>标记中,现在它可以根据需要工作了!

最新更新