详解Django的 form_valid_redirect() 函数:返回表单验证成功后的重定向 URL

  • Post category:Python

form_valid_redirect() 函数是 Django 中用于表单提交成功后跳转的功能函数。该函数默认实现是在表单验证通过且 form_valid() 函数返回一个 HTTP 重定向时被调用。form_valid_redirect() 函数会在表单提交成功后自动跳转到指定的页面。

form_valid_redirect() 函数有三个参数 urlpermanentquery_string,下面是每个参数的解释:

  • url:必填参数,跳转的路径;
  • permanent:默认为 False,如果设为 True 则表示为永久跳转;
  • query_string:默认为 False,如果设为 True 则重定向的同时也会带上当前请求的查询参数。

使用方法:

在一个类视图中,如果表单验证成功后需要跳转到一个指定的页面,我们可以通过继承 FormView 并覆盖 form_valid() 函数来实现:

from django.views.generic import FormView

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

    def form_valid(self, form):
        # 如果表单验证通过,将会执行跳转操作
        return self.form_valid_redirect(self.get_success_url())

通过 form_valid_redirect() 函数实现自定义成功的跳转路径在使用中非常方便,下面给出两个实例:

实例1:

我们需要在表单提交成功后跳转到新建文章的页面,可以这样实现:

from django.views.generic import FormView
from django.urls import reverse_lazy

class ArticleCreateView(FormView):
    form_class = ArticleCreateForm
    template_name = 'article_create.html'

    def form_valid(self, form):
        form.save()
        url = reverse_lazy('article:detail', kwargs={'pk': form.instance.pk})
        return self.form_valid_redirect(url)

在表单提交成功后,我们将表单的数据保存,并使用 reverse_lazy() 生成一个跳转的 URL,最后使用 form_valid_redirect() 函数实现跳转操作,代码非常简洁。

实例2:

我们需要在表单提交成功后更新某个对象并跳转到另一个页面,可以这样实现:

from django.views.generic import UpdateView
from django.urls import reverse_lazy

class ArticleUpdateView(UpdateView):
    model = Article
    fields = ['title', 'content']
    template_name = 'article_update.html'

    def form_valid(self, form):
        form.save()
        url = reverse_lazy('article:detail', kwargs={'pk': self.object.pk})
        return self.form_valid_redirect(url)

在被更新对象的表单提交成功后,我们同样将表单的数据进行保存,并使用 reverse_lazy() 生成一个跳转的 URL,最后使用 form_valid_redirect() 函数实现跳转操作,这是 Django 中更新对象非常常见的实践方式。