form_invalid_redirect()
函数是 Django 核心框架中用于处理表单验证错误时的重定向函数,它可以帮助开发者在表单数据验证失败时返回到指定的页面,提示用户错误原因。
当表单验证失败时就会调用 form_invalid()
函数,而 form_invalid()
函数的默认处理方式是返回到当前页面,展示错误信息。但有些情况下,开发者可能需要自定义错误信息的展示方式,这就需要用到 form_invalid_redirect()
函数来实现:
def form_invalid_redirect(self, target_page, **kwargs):
"""
自定义表单无效处理函数,重定向到指定页面
:param target_page: 重定向页面URL
:param kwargs: URL参数
:return: HttpResponse
"""
redirect_url = url_with_querystring(target_page, kwargs)
return HttpResponseRedirect(redirect_url)
它的参数非常简单,只包含两个:
target_page
:重定向页面的 URL。**kwargs
:需要添加到 URL 中的参数,可以是任何合法的键值对。
在使用 form_invalid_redirect()
函数时,只需要在 form_invalid()
函数中调用即可。下面是一个关于 form_invalid_redirect()
函数的使用案例:
class LoginView(FormView):
"""
用户登录视图
"""
template_name = 'login.html'
form_class = LoginForm
def form_invalid(self, form):
return self.form_invalid_redirect(reverse('login'), username=self.request.POST.get('username'))
def form_valid(self, form):
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user:
login(request=self.request, user=user)
return HttpResponseRedirect(reverse('home'))
return self.form_invalid_redirect(reverse('login'), username=username)
在上述代码中,我们采用了自定义的验证错误处理方式,即跳转到指定的登录页面,并添加了一个名为 username
的 URL 参数,它的值是用户在登录时输入的用户名。这样,当用户在输入密码时出现错误时,我们就可以将错误信息显示在登录表单中,并且避免用户再次输入用户名。
另一个实例:
class ContactView(FormView):
"""
联系我们视图
"""
template_name = 'contact.html'
form_class = ContactForm
def form_valid(self, form):
subject = form.cleaned_data.get('subject')
message = form.cleaned_data.get('message')
sender = form.cleaned_data.get('sender')
recipients = [settings.DEFAULT_FROM_EMAIL]
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect(reverse('contact_success'))
def form_invalid(self, form):
return self.form_invalid_redirect(reverse('contact'), subject=self.request.POST.get('subject'), message=self.request.POST.get('message'), sender=self.request.POST.get('sender'))
在这个例子中,我们定义了一个用于发送邮件的联系方式表单。当用户输入有误时,我们采用自定义处理方式,即将用户输入的数据(如邮件主题、内容和发送人)添加到跳转 URL 中,并且跳转到 contact
页面。这样,当用户重新填写表单时,他们可以看到先前输入的数据,便于做出更改。