首页 > 解决方案 > 表单未显示 ValidationError

问题描述

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

标签: djangopython-3.x

解决方案


罪魁祸首是您创建了一个新 的事实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请求将永远无法正确完成,因为那时表单看到 a 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})

此外,我们在这里重复代码路径。用户是否是超级用户确实有一些影响,但是没有理由将程序的其余部分都写在两个单独的代码路径中。我们可以做一个if声明来完成这项工作,然后让代码路径再次加入。

此外,我们因此总是构造一个形式(在第一个if语句中)。此外,view函数的名称(像所有函数一样)通常只使用小写字母。


推荐阅读