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

  • Post category:Python

form_valid_redirect() 是 Django 中 FormView 类中的一个函数,用于在表单验证成功后跳转到指定的 URL。它可以帮助我们在表单提交成功时,自动跳转到指定的页面。

使用该函数需要先继承 Django 中的 FormView 类,然后根据需要重写 form_valid() 函数,并在该函数中使用 form_valid_redirect() 函数实现跳转操作。

下面提供两个实例说明该函数的使用方法:

例子一

在一个投票网站的投票表单页面,用户填写完表单并提交后,需要将用户提交的数据保存起来,并跳转到投票结果页面,显示当前的投票情况。

实现步骤如下:

  1. 定义投票表单 VoteForm,并继承 forms.ModelForm 类。
from django import forms
from .models import Vote

class VoteForm(forms.ModelForm):

    class Meta:
        model = Vote
        fields = ['name', 'option']
  1. 定义投票结果页面 VoteResultView。其中需要重写 form_valid() 函数,并在该函数中调用 form_valid_redirect() 函数实现跳转。
from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from .models import Vote
from .forms import VoteForm

class VoteResultView(FormView):
    template_name = 'vote_result.html'
    form_class = VoteForm
    success_url = reverse_lazy('vote:result')

    def form_valid(self, form):
        name = form.cleaned_data['name']
        option = form.cleaned_data['option']
        Vote.objects.create(name=name, option=option)
        return self.form_valid_redirect()
  1. 在 urls.py 文件中定义对应的路由,并指定处理该路由的视图类为 VoteResultView。
from django.urls import path
from .views import VoteResultView

app_name = 'vote'
urlpatterns = [
    path('vote/', VoteResultView.as_view(), name='result'),
]

例子二

在一个在线商城的订单表单页面,用户填写完表单并提交后,需要将用户提交的订单数据保存起来,并跳转到订单详情页面,显示提交的订单信息。

实现步骤如下:

  1. 定义订单表单 OrderForm,并继承 forms.ModelForm 类。
from django import forms
from .models import Order

class OrderForm(forms.ModelForm):

    class Meta:
        model = Order
        fields = ['product_name', 'quantity', 'receiver_name', 'receiver_address']
  1. 定义订单详情页面 OrderDetailView。其中需要重写 form_valid() 函数,并在该函数中调用 form_valid_redirect() 函数实现跳转。
from django.views.generic.detail import DetailView
from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from .models import Order
from .forms import OrderForm

class OrderDetailView(DetailView):
    model = Order
    template_name = 'order_detail.html'
    context_object_name = 'order'

class OrderCreateView(FormView):
    template_name = 'order_create.html'
    form_class = OrderForm
    success_url = reverse_lazy('shop:order_detail')

    def form_valid(self, form):
        order = form.save()
        return self.form_valid_redirect(order_pk=order.pk)
  1. 在 urls.py 文件中定义对应的路由,并指定处理该路由的视图类为 OrderCreateView 和 OrderDetailView。
from django.urls import path
from .views import OrderCreateView, OrderDetailView

app_name = 'shop'
urlpatterns = [
    path('order/create/', OrderCreateView.as_view(), name='order_create'),
    path('order/<int:pk>/', OrderDetailView.as_view(), name='order_detail'),
]

通过以上两个实例,我相信您已经理解了 form_valid_redirect() 函数的作用与使用方法。