表单上的 Django 错误而不是引发 ValidationError

Django Error on Form instead of raising a ValidationError

我想知道如何在表单上显示错误而不是引发验证错误页面。我的意思是当在表单本身上生成错误列表时,我将附上不同表单的屏幕截图,因为我的解释不是最好的哈哈。

现在在我看来,我提出了一个 ValidationError 而不是仅添加错误本身的表单。我怎样才能添加表单错误而不是引发实际的验证错误?我希望 errorlist 的正常行为出现在我的表单上。非常感谢任何帮助!

我的看法如下:

class EditProfileInformationView(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        form = UserEditForm(initial={
            'first_name': self.request.user.first_name,
            'last_name': self.request.user.last_name,
            'email': self.request.user.email
        })
        context = {
            'form':form
        }
        return render(request, 'accounts/update.html', context)

    def post(self, request, *args, **kwargs):
        form = UserEditForm(instance=request.user, data=request.POST)
        context = {
            'form': form
        }
        if form.is_valid():
            initial_email = self.request.user.email
            form.save(commit=False)
            email = form.cleaned_data['email']
            if User.objects.filter(email=email).exists() and email != initial_email:
                raise ValidationError('This email already exists')
            else:
                form.save()
                messages.success(request,'Profile Successfully Updated')
                return redirect('/')
        else:
            return render(request, 'accounts/update.html', context)

如果您在 get/post 视图函数中引发错误,那么这意味着服务器将 return 服务器错误:如果出现错误,您的视图仍应 return 一个 HTTP 响应,可能状态代码在 400-499 范围内(客户端错误),但不会引发异常。

在您的 UserEditForm 中,您应该通过以下方式实现此唯一性过滤器:

class UserEditForm(forms.ModelForm):
    # …
    
    def clean_email(self):
        email = self.cleaned_data['email']
        qs = User.objects.exclude(<strong>pk=self.object.pk</strong>).filter(<strong>email=email</strong>)
        if qs.exists():
             raise ValidationError('This email already exists')
        return email

通常情况下,视图不应执行(广泛的)验证,由表单来确保数据有效且经过清理。