详解Django的 get_success_url() 函数:获取成功提交表单后的重定向 URL

  • Post category:Python

get_success_url()函数是Django框架中一个用来获取成功重定向URL的方法。在Django中,当一个POST请求处理完成时,可以使用get_success_url()方法来返回到指定的URL。以下是详细的使用方法攻略和实例说明。

get_success_url()函数的作用

Django在处理HTTP请求时,通常会使用表单或视图函数来生成响应。表单通常用于接收用户输入数据,并将其提交到后台进行处理。而视图函数通常用于处理HTTP请求并返回相应的响应。

在某些情况下,我们需要在表单提交数据后,将用户重定向到其他页面。比如,当用户成功登录后,需要将其重定向到主页。这时就可以使用get_success_url()函数来获取成功重定向URL。

get_success_url()函数的使用说明

在Django中,我们可以使用get_success_url()函数来重定向到成功页面,它的使用方式如下:

from django.urls import reverse_lazy

class MyFormView(FormView):
    form_class = MyForm
    template_name = 'form.html'
    success_url = reverse_lazy('success-page')

    def form_valid(self, form):
        # do something here
        return super().form_valid(form)

    def get_success_url(self):
        return super().get_success_url()

在以上代码中,reverse_lazy('success-page')指定了成功页面的URL,这样提交表单后,Django会将用户重定向到该页面。

此外,我们还可以根据具体的情况,使用其他方法来获取成功重定向URL。例如:

  • 使用get_success_url()函数根据表单数据生成URL:
def get_success_url(self):
    return reverse_lazy('success-page', args=[self.object.id])
  • 使用get_success_url()函数根据请求参数生成URL:
def get_success_url(self):
    query_params = self.request.GET.copy()
    query_params['success'] = 1
    return '{}{}'.format(reverse_lazy('form-page'), query_params.urlencode())

以上两种方法都是根据不同的来源,使用参数生成成功重定向URL的例子。需要注意的是,在第二个例子中,query_params是从request.GET中获取的,这个属性是一个字典,可以用于获取GET请求的所有参数。

实例1:使用get_success_url()函数根据表单数据生成URL

以下是一个简单的例子,我们根据表单数据,使用get_success_url()函数来生成重定向URL。

# urls.py
from django.urls import path
from .views import MyFormView

urlpatterns = [
    path('form/', MyFormView.as_view(), name='form-page'),
    path('success/<int:pk>', SuccessView.as_view(), name='success-page')
]

# views.py
from django.urls import reverse_lazy
from django.views.generic import FormView
from .forms import MyForm

class MyFormView(FormView):
    form_class = MyForm
    template_name = 'form.html'
    success_url = reverse_lazy('success-page')

    def form_valid(self, form):
        form.save()
        return super().form_valid(form)

    def get_success_url(self):
        return reverse_lazy('success-page', args=[self.object.id])

class SuccessView(TemplateView):
    template_name = 'success.html'

在这个例子中,我们定义了一个表单页面form.html,表单中包含了一个name字段。表单请求成功后,我们将根据表单数据生成一个新的URL。这个URL将被用于在SuccessView视图中展示成功页面success.html

实例2:使用get_success_url()函数根据请求参数生成URL

以下是一个使用get_success_url()函数生成URL,且URL中包含GET请求参数的例子。

# urls.py
from django.urls import path
from .views import MyFormView

urlpatterns = [
    path('form/', MyFormView.as_view(), name='form-page'),
    path('success/', SuccessView.as_view(), name='success-page')
]

# views.py
from django.urls import reverse_lazy
from django.views.generic import FormView
from .forms import MyForm

class MyFormView(FormView):
    form_class = MyForm
    template_name = 'form.html'
    success_url = reverse_lazy('success-page')

    def form_valid(self, form):
        form.save()
        return super().form_valid(form)

    def get_success_url(self):
        query_params = self.request.GET.copy()
        query_params['success'] = 1
        return '{}{}'.format(reverse_lazy('form-page'), query_params.urlencode())


class SuccessView(TemplateView):
    template_name = 'success.html'

在这个例子中,MyFormView视图是一个简单的表单视图,我们根据表单的提交结果,在表单页面中展示一个成功标识。当用户成功提交表单后,我们将生成一个重定向URL,将视图重定向到success.html页面。同时,我们还向原URL上添加一个查询参数success=1,用于在表单页面中展示成功标识。

以上两个例子展示了get_success_url()函数在不同情况下的用法,前者是根据表单数据生成URL,后者是根据请求参数(也就是request.GET)生成URL。这都是Django中常见的用法。