它不会显示任何验证错误,而是会重新加载空表单,直到所有表单字段都进行行为验证为止。 views.py
def Leave_management(request):
if request.user.is_superuser:
form = LeaveForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('leave_list')
else:
form = LeaveForm()
return render(request, 'leave_management.html', {'form': form})
if not request.user.is_superuser and not request.user.is_anonymous:
form = LeaveForm(request.POST or None)
form.fields['status'].disabled = True
if form.is_valid():
form.save()
return redirect('leave_list')
else:
form = LeaveForm()
return render(request, 'leave_management.html', {'form': form})
模板
<hr><h1>Leave Application</h1><hr>
<form method="post">
{% csrf_token %}
{{form|crispy}}
<input type="submit" value="submit" >
</form>
答案 0 :(得分:2)
罪魁祸首是您创建新 LeaveForm
的事实:
def Leave_management(request):
if request.user.is_superuser:
form = LeaveForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('leave_list')
else:
form = LeaveForm()
return render(request, 'leave_management.html', {'form': form})
if not request.user.is_superuser and not request.user.is_anonymous:
form = LeaveForm(request.POST or None)
form.fields['status'].disabled = True
if form.is_valid():
form.save()
return redirect('leave_list')
else:
form = LeaveForm()
return render(request, 'leave_management.html', {'form': form})
因此,您创建了一个新表单,该表单当然对通过它发送的值一无所知。
但是此外,request.POST or None
模式也不是一个好主意:它将导致以下事实:如果您的表单本身本身不需要数据,那么POST
请求将永远无法得到正确完成后,此后该表单会看到None
,并假定您是第一次构造该表单。
想法是将request.POST
馈入表单,以防这是一个发帖请求,例如:
def leave_management(request):
if request.method == 'POST':
form = LeaveForm(request.POST)
else:
form = LeaveForm()
if not request.user.is_superuser and not request.user.is_anonymous:
form.fields['status'].disabled = True
if form.is_valid():
form.save()
return redirect('leave_list')
else:
return render(request, 'leave_management.html', {'form': form})
此外,我们在这里 de 复制代码路径。用户是否是超级用户确实会产生一些影响,但是没有理由将过程的其余部分全部写在两个单独的代码路径中。我们可以做一个if
语句来完成这项工作,然后让代码路径再次加入。
此外,我们总是构造一个 one 形式(在第一个if
语句中)。此外,view
函数的名称(像所有函数一样)通常仅使用小写字母。