详解Django的 get_failure_url() 函数:获取表单处理失败后的跳转 URL

  • Post category:Python

get_failure_url()是Django Web框架中的一个函数,用于在所请求的视图函数执行失败的情况下,获取返回给用户的重定向URL。

该函数常用于处理表单验证失败的情况,比如当用户把表单得到结果提交给服务器端进行处理时,如果验证失败,则该函数会将视图函数的执行结果作为一个参数传入,并返回重定向到表单原始页面的URL。这样用户可以继续填写并重新提交表单。

具体使用方法如下:

  1. 在视图函数中添加get_failure_url()函数
from django.urls import reverse
from django.views import View


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

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

    def post(self, request):
        form = self.form_class(request.POST)

        if form.is_valid():
            # 处理表单提交逻辑
            pass
        else:
            # 表单验证失败处理逻辑
            return HttpResponseRedirect(self.get_failure_url(form))

    def get_failure_url(self, form):
        return reverse('login') + '?error=invalid'
  1. 在视图函数中根据需求编写get_failure_url()函数的逻辑

get_failure_url()函数会接收一个参数,即视图函数执行的结果。根据这个结果,我们可以编写相应的重定向逻辑,比如在表单验证失败的情况下,我们可以将用户重定向到表单原始页面,并附加参数?error=invalid以便在模板中渲染相应的错误提示信息。

下面举两个例子来说明get_failure_url()函数的使用场景:

例子一:带有查询参数的重定向

假设我们的网站具有一个商品详情页面,可以通过这个页面查看某个商品的详细信息。当用户访问某个商品详情页面时,如果该商品不存在,则需要给出相应的提示信息,同时将用户重定向到商品列表页面,代码如下:

from django.urls import reverse
from django.http import HttpResponseRedirect


def ItemDetailView(request, item_id):
    item = Item.objects.get(id=item_id)

    if item is None:
        return HttpResponseRedirect(get_failure_url(request))

    # 在模板中渲染商品详情信息
    ...

def get_failure_url(request):
    return reverse('item_list') + '?error=item_not_found'

当商品不存在时,我们调用get_failure_url()函数,生成一个带有查询参数?error=item_not_found的重定向URL,并将用户重定向到商品列表页面。在商品列表页面中,我们根据查询参数error,给出相应的错误提示信息。

例子二:表单验证失败后跳转回原始页面

假设我们的网站具有一个登录页面,当用户输入用户名和密码并提交表单时,如果表单验证失败,则需要将用户重定向回登录页面,并给出相应的错误原因,代码如下:

from django.urls import reverse
from django.views.generic import FormView
from django.http import HttpResponseRedirect

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

    def form_valid(self, form):
        # 处理表单提交逻辑
        result = ...

        if result == 'success':
            # 登录成功,重定向到用户首页
            return HttpResponseRedirect(reverse('user_home'))
        else:
            # 登录失败,重定向回原始页面
            return HttpResponseRedirect(self.get_failure_url(form))

    def get_failure_url(self, form):
        return self.request.build_absolute_uri() + '?error=login_failed'

form_valid函数中,如果处理逻辑返回结果为success,则重定向到用户首页;否则调用get_failure_url()函数,将用户重定向回登录页面,并附加查询参数?error=login_failed以便在登录页面中渲染错误信息。

以上是get_failure_url()的一个简单应用,该函数可以很好的解决表单验证失败时的跳转问题,使得我们可以更加便捷地处理表单验证业务逻辑。