详解Django的 form_invalid_redirect() 函数:返回表单验证失败后的重定向 URL

  • Post category:Python

Django的form_invalid_redirect()函数是在表单提交失败时执行的一种重定向机制,其作用是将表单提交失败后的错误信息重新返回给用户,使用户可以对错误进行修改。本文将为大家介绍这个函数的使用方法及其相关实例。

使用方法

form_invalid_redirect()函数的使用方法非常简单,我们只需要将其放置在视图函数中的表单处理逻辑之后即可。在表单提交失败时,我们可以将控制流重定向到本函数中,来让Django自动处理表单的验证问题并将错误信息返回给用户。

具体的使用方法如下所示:

from django.shortcuts import redirect
from django.urls import reverse

class MyFormView(FormView):
    template_name = 'my_form.html'
    form_class = MyForm

    def form_invalid(self, form):
        # 使用 form_invalid_redirect() 函数跳转到指定的 url 路径
        return redirect(reverse('my_form_invalid'))

在上面的例子中,我们通过form_invalid函数来控制表单提交失败时的重定向逻辑,将重定向的路由路径设置为了my_form_invalid,来实现表单提交失败后的跳转。

实例分析

光有理论是不够的,我们来看下面两个实际案例,进一步了解form_invalid_redirect()函数的使用方法和效果。

实例一:提交表单失败后返回错误信息

假定我们现在有一个文章发布页面,我们需要对用户由于格式不对导致的表单提交失败做出反应并返回错误信息。代码如下所示:

from django import forms
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views.generic import FormView

class ArticleForm(forms.Form):
    title = forms.CharField(max_length=20)
    content = forms.CharField(max_length=500)

class ArticlePublishView(FormView):
    template_name = 'article_publish.html'
    form_class = ArticleForm

    def form_invalid(self, form):
        # 如果表单填写不正确则跳转到另一个提交页面
        return redirect(reverse('article_publish_fail'))

    def form_valid(self, form):
        # 如果表单填写正确,则做一些数据库和文件操作等逻辑,并跳转到最后发布成功页面
        return redirect(reverse('article_publish_success'))

在上面的例子中,如果用户在文章发布的表单中输入格式不正确,比如输入的标题太长或文章内容超出了500个字符等,则表单提交失败并将调到form_invalid函数中。

而这个函数中我们将通过form_invalid_redirect()函数进行重定向,将重定向的路由路径设为了article_publish_fail,这样用户就可以根据表单返回的错误信息再次修改并提交。

实例二:跳转到指定页面

现在我们需要实现一个带有验证码的登录页面,而验证码会在用户填写错误时进行刷新并继续等待。我们需要在表单填写错误后返回带有验证码的登录页面,并显示上一个验证码。代码如下所示:

from django import forms
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views.generic import FormView

class LoginForm(forms.Form):
    username = forms.CharField(max_length=20)
    password = forms.CharField(max_length=20)
    verification_code = forms.CharField(max_length=4)

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

    def post(self, request, *args, **kwargs):
        form_data = request.POST
        username = form_data.get('username', '')
        password = form_data.get('password', '')
        verification_code = form_data.get('verification_code', '')
        if  not verification_code:
            return redirect(reverse('login_fail'))
        if verification_code != request.session.get('verification_code', '') :
            request.session['verification_code'] = ''
            return redirect(reverse('login_fail'))

        # 验证成功则执行登录逻辑
        ...

在上述例子中,我们首先读取避免验证码不通过时的表单错误信息,然后将错误信息存储到session中,并设置跳转视图路由路径为login_fail,最后跳转到自定义设计的带有验证码的登录页面,并将上一个验证码显示出来,用户可以再次填写并提交。

通过上述两个实例分析,我们可以感受到更加直观和实际使用场景下的form_invalid_redirect()函数,真正体会到了函数的强大威力。