Django 中在视图函数中获取 ValidationError 消息

114 阅读2分钟

在编写 RESTful 服务时,我们可能会遇到需要在视图函数中获取表单验证错误消息的情况。假设我们有一个 RegistrationForm 表单,其中有一个名为 "password_validate" 的字段,用于验证用户输入的密码是否与 "password" 字段的值一致。如果密码不一致,表单验证会引发 ValidationError 异常,并显示相应的错误消息。

huake_00152_.jpg

解决方案

为了在视图函数中获取 ValidationError 异常的消息,我们可以通过访问 registration_form.errors 字典来实现。例如,在 views.py 文件中,我们可以使用以下代码来获取错误消息:

if registration_form.is_valid() == False:
    error_message = registration_form.errors["password_validate"][0]
    response = HttpResponse(error_message, content_type="text/plain")
    response.status_code = 400
    return response

在上面的代码中,我们首先检查表单是否有效。如果表单无效,我们通过访问 registration_form.errors["password_validate"][0] 来获取第一个错误消息。然后,我们将错误消息作为响应正文返回,并设置响应状态码为 400 (Bad Request)。

代码例子

以下是一个完整的代码示例,演示如何使用 Django 在视图函数中获取 ValidationError 异常的消息:

from django import forms
from django.http import HttpResponse
from django.views.decorators.http import require_http_methods

# 定义表单类
class RegistrationForm(forms.Form):
    email = forms.EmailField(required=True, label="E-Posta")
    username = forms.SlugField(required=True, label="Kullanıcı Adı")
    password = forms.CharField(required=True, label="Şifre", min_length=8)
    password_validate = forms.CharField(required=True, label="Tekrar Şifre", min_length=8)
    captcha = CaptchaField()

    def clean(self):
        password = self.cleaned_data.get("password")
        password_validate = self.cleaned_data.get("password_validate")

        if password != password_validate:
            raise forms.ValidationError("Şifreler uyuşmuyor.")

# 定义视图函数
@require_http_methods(["POST"])
def registration_validator(request):
    registration_form = RegistrationForm(request.POST)

    if registration_form.is_valid():
        # 表单有效,处理数据并返回适当的响应
        return HttpResponse("Form is valid", content_type="text/plain")
    else:
        # 表单无效,获取错误消息并返回适当的响应
        error_message = registration_form.errors["password_validate"][0]
        return HttpResponse(error_message, content_type="text/plain", status=400)

在上面的代码中,我们定义了一个 RegistrationForm 表单类,并在表单的 clean() 方法中添加了密码验证逻辑。然后,我们定义了一个名为 registration_validator 的视图函数,该函数使用 @require_http_methods(["POST"]) 装饰器来确保只接受 POST 请求。在视图函数中,我们创建了一个 RegistrationForm 实例,并检查其有效性。如果表单有效,我们将返回一个 "Form is valid" 的响应。如果表单无效,我们将获取错误消息并返回一个 400 (Bad Request) 响应。