详解Django的 form_invalid_message() 函数:返回表单验证失败后的消息

  • Post category:Python

form_invalid_message()是Django中一个用于自定义表单校验失败时错误信息展示的函数,作为FormMixin类的一个方法,其主要功能是在表单提交后、校验失败后,显示用户自定义的错误信息。

作用

当Form校验失败时,Django默认会把错误展示在表单上,而form_invalid_message()函数则提供了一个机会,让开发者可以自定义错误信息的展示方式。使用此函数,当校验失败时,我们可以将特定的错误信息以特定方式呈现给用户,提高用户体验的同时,也为用户提供了更加准确详细的错误信息。

使用方法

基本使用方法

class MyFormView(FormView):
    form_class = MyForm
    template_name = 'my-form-template.html'

    def form_invalid(self, form):
        messages.error(self.request, self.form_invalid_message())
        return super().form_invalid(form)

    def form_invalid_message(self):
        return "Form校验失败,请检查输入是否正确。"

以上是一个基本的form_invalid_message()函数的使用方式。可以看出,其使用方法包含以下步骤:

  1. 在视图中编写form_invalid_message()函数,自定义显示在页面上的错误信息。
  2. 在视图的form_invalid()方法中使用messages库向用户展示校验失败信息。

带参数的使用方法

class MyFormView(FormView):
    form_class = MyForm
    template_name = 'my-form-template.html'

    def form_invalid(self, form):
        messages.error(self.request, self.form_invalid_message(form))
        return super().form_invalid(form)

    def form_invalid_message(self, form):
        error_list = []
        for error in form.errors:
            error_list.append("{}: {}".format(error, form.errors[error][0]))
        message = '\n'.join(error_list)
        return "Form校验失败,请按以下错误信息检查:\n{}".format(message)

另一种常见的使用场景是在默认错误提示基础上添加额外的信息。例如,我们希望在校验失败时,除了默认的错误提示外,还要提示用户针对哪几个输入框出现了问题。以下是实现这一需求的代码:

  1. form_invalid_message()函数中,先使用原来的错误消息提示,再遍历到表单中每个错误,组合完整错误消息。
  2. form_invalid()方法中,将消息传递给messages库输出。

示例

样例一

比如我们有一个简单的登录表单,由于某些原因在登录时需要使用一个特定的验证码,如果验证码输入错误,则表单校验失败。这是我们可以使用form_invalid_message()函数自定义错误消息并输出,让用户看到这个错误时可以更加清晰明了:

class LoginFormView(FormView):
    form_class = LoginForm
    template_name = 'login.html'

    def form_invalid(self, form):
        messages.error(self.request, self.form_invalid_message())
        return super().form_invalid(form)

    def form_invalid_message(self):
        return "验证码错误,请重新输入。"

在上述代码中,我们在函数form_invalid()中使用了form_invalid_message()函数来自定义错误信息,当用户提交一个带有错误验证码的登录表单时,将展示错误信息“验证码错误,请重新输入”。

样例二

假设我们在表单中要求用户输入一堆信息,每个信息都必须输入。那么,当有多个信息都没有输入时,当出现校验错误时,form_invalid_message()函数可以帮助我们能在提示中区分出每个字段发生的问题:

class InformationFormView(FormView):
    form_class = InformationForm
    template_name = 'information.html'

    def form_invalid(self, form):
        messages.error(self.request, self.form_invalid_message(form))
        return super().form_invalid(form)

    def form_invalid_message(self, form):
        error_list = []
        for error in form.errors:
            error_list.append("{}: {}".format(error, form.errors[error][0]))
        message = '\n'.join(error_list)
        return "请输入所有信息:\n{}".format(message)

在上述代码中,我们先使用一个for循环,遍历表单中的每个校验错误,再将其加入到最终的错误提示中。例如,如果两个输入框都没有填写,那么错误提示可能会是“请输入所有信息:\nfield1: 这个字段是必填字段\nfield2: 这个字段是必填字段”。这样,当出现多个错误时,用户可以明确了解所有错误的本质,不会感到懵逼。