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

  • Post category:Python

form_valid_redirect()函数是Django框架中FormMixin类提供的一个重要方法,它用于在表单提交成功后完成重定向操作。该方法将在验证和保存表单数据成功后调用,而不是将请求处理到form_valid()方法中,所以允许你更灵活地控制重定向操作的逻辑。

该方法可以接收一个参数self,它代表当前正在处理的视图对象。除此之外,还可以接收form表单对象,并返回一个HttpResponseRedirect重定向对象进行重定向。

具体使用方法如下:

  1. 定义视图类,继承CreateView或者UpdateView等内置视图类,并在类中引入FormMixin类。

例如,创建一个新的表单填写页面:

from django.views.generic.edit import CreateView, FormMixin
from .forms import MyForm

class MyFormView(CreateView, FormMixin):
    form_class = MyForm
    ...

在以上代码中,我们引用了我们自定义的表单类MyForm,并将其赋值给视图类中的form_class属性。

  1. 实现form_valid_redirect()方法
def form_valid_redirect(self, form):
    # 获取表单数据
    data = form.cleaned_data
    # 利用表单数据完成操作(插入数据、发送邮件等)
    ...
    # 完成处理后,实现重定向逻辑
    return super(MyFormView, self).form_valid_redirect(form)

在以上代码中,我们获取到了表单数据data,可以对其进行相应的操作后进行重定向。需要注意的是,由于我们在视图类中引入了FormMixin类,因此可以调用super()方法实现父类的form_valid_redirect()方法,所以我们不需要在重写该方法时重新编写重定向逻辑。

以下是两个实例:

  1. 根据表单输入完成数据插入和跳转
class MyFormView(CreateView, FormMixin):
    form_class = MyForm
    template_name = 'my_form.html'
    success_url = '/thanks/'

    def form_valid_redirect(self, form):
        # 获取表单数据
        instance = form.save(commit=False)
        # 完成操作:数据插入
        instance.save()
        # 完成操作后进行重定向
        return super().form_valid_redirect(form)

在以上代码中,我们首先在视图类中定义了一个success_url属性,指定表单成功提交后的重定向地址。然后,在实现form_valid_redirect()方法时,我们首先利用form.save(commit=False)方法获取到表单数据,然后对其进行操作,如将数据插入到数据库中。最后,我们通过调用父类的form_valid_redirect()方法并传递form表单对象来实现重定向。

  1. 根据表单输入数据获取指定的页面并跳转
class MyFormView(CreateView, FormMixin):
    form_class = MyForm
    template_name = 'my_form.html'

    def form_valid_redirect(self, form):
        # 获取表单数据
        data = form.cleaned_data
        # 完成操作:页面获取和跳转
        return HttpResponseRedirect('/page/{}'.format(data['page_name']))

在以上代码中,我们在实现form_valid_redirect()方法时,首先利用form.cleaned_data方法获取到表单数据。然后,我们根据表单输入的page_name参数值,拼接出要跳转的页面地址/page/{}'.format(data['page_name'])。最后,我们利用HttpResponseRedirect()方法来跳转到指定的页面。