表单未显示ValidationError

时间:2018-06-20 13:36:34

标签: django python-3.x

它不会显示任何验证错误,而是会重新加载空表单,直到所有表单字段都进行行为验证为止。 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>

1 个答案:

答案 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函数的名称(像所有函数一样)通常仅使用小写字母。