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

  • Post category:Python

首先,需要说明的是,form_invalid_redirect()并不是Django中已有的函数。在Django中,form_invalid()方法是处理表单校验失败的默认方法,它会返回一个带有错误信息的表单页面。如果我们需要在校验失败时将用户重定向到另一个页面,那么就需要自定义这个方法,并在其中使用redirect()函数完成重定向操作。下面提供两个实例来说明该方法的使用。

实例1 :在表单校验失败时重定向到另一个页面

我们假设有一个用户登录的页面,需要校验用户名和密码是否匹配。如果表单校验失败,比如用户名或密码为空,那么我们希望将用户重定向到另一个页面,而不是返回一个带有错误信息的表单页面。

from django.shortcuts import render, redirect
from django.views import View
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(label='用户名')
    password = forms.CharField(label='密码', widget=forms.PasswordInput)

class LoginView(View):
    template_name = 'login.html'

    def get(self, request):
        form = LoginForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = LoginForm(request.POST)
        if form.is_valid():
            # 校验通过,登录成功,直接返回到首页
            return redirect('/')
        else:
            # 校验失败,重定向到另一个页面
            return redirect('/login_failed/')

在上面的代码中,我们为登录表单定义了一个LoginForm类,并在LoginView中处理了登录的逻辑。在post方法中,我们首先校验表单数据是否合法,如果通过校验,则直接返回到首页;如果校验失败,则使用redirect()方法将用户重定向到另一个页面/login_failed/

实例2 :在表单校验失败时重定向带有错误信息的页面

在上一个示例中,我们将用户重定向到另一个页面,但是没有提供任何错误信息。如果需要将错误信息带回到重定向的页面,那么就需要使用URL参数的方式传递错误信息。

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

class LoginForm(forms.Form):
    username = forms.CharField(label='用户名')
    password = forms.CharField(label='密码', widget=forms.PasswordInput)

class LoginView(View):
    template_name = 'login.html'

    def get(self, request):
        form = LoginForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = LoginForm(request.POST)
        if form.is_valid():
            # 校验通过,登录成功,直接返回到首页
            return redirect('/')
        else:
            # 校验失败,重定向带有错误信息的页面
            error_msg = '用户名或密码错误'
            url = '{url}?error_msg={msg}'.format(
                url=reverse('login'),
                msg=error_msg
            )
            return redirect(url)

在上面的代码中,我们首先在post方法中校验了表单数据是否合法。如果校验失败,我们将错误信息保存在一个变量中,并使用reverse()方法构造向登录页面的URL,同时使用URL参数的方式将错误信息传递过去。reverse()方法会根据URL的别名生成URL路径,这样可以避免硬编码URL路径带来的不便。最后,我们使用redirect()方法将用户重定向到新的URL。在登录页面的get方法中,我们可以获取到URL参数中传递的错误信息,并将其渲染到页面中。

{% if request.GET.error_msg %}
    <div class="error">{{ request.GET.error_msg }}</div>
{% endif %}

以上就是form_invalid_redirect()的使用方法,实际上在Django中并没有这个名字的方法,我们需要自定义form_invalid()方法并在其中使用redirect()方法完成重定向操作。