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()
函数的使用方式。可以看出,其使用方法包含以下步骤:
- 在视图中编写
form_invalid_message()
函数,自定义显示在页面上的错误信息。 - 在视图的
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)
另一种常见的使用场景是在默认错误提示基础上添加额外的信息。例如,我们希望在校验失败时,除了默认的错误提示外,还要提示用户针对哪几个输入框出现了问题。以下是实现这一需求的代码:
- 在
form_invalid_message()
函数中,先使用原来的错误消息提示,再遍历到表单中每个错误,组合完整错误消息。 - 在
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: 这个字段是必填字段”。这样,当出现多个错误时,用户可以明确了解所有错误的本质,不会感到懵逼。