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

  • Post category:Python

get_success_url()是Django框架中常用的一个函数,它在表单提交成功后,将用户重定向到一个指定页面上。

作用

在Django框架中,当用户填写表单并提交后,很多时候不希望用户停留在当前页面,而是需要将其重定向到另一个页面上。get_success_url()函数就是用来实现这个功能的。

具体来说,当用户在表单中填写数据并提交后,框架会执行相应的验证程序,如果验证通过,那么就会执行get_success_url()函数并将用户重定向到指定的页面上。如果验证不通过,那么就会返回一个表单给用户提示出错信息。

使用方法

在Django框架中,使用get_success_url()函数有以下几个步骤:

  1. 在相关的视图函数中加入get_success_url()函数,该函数接受一个参数kwargs,并构建一个重定向的url地址.
  2. 在相应的表单类(Form)中覆盖父类中的get_success_url()方法,并返回一个完整的跳转url地址。

下面通过两个例子来说明get_success_url()函数的使用方法。

例1:基于CreateView的表单提交重定向

考虑如下的模型类:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)

我们希望完成一个基于CreateView的视图函数,当用户提交Book模型的新增数据时,将其重定向到书目录页面book_list.html。

根据上述引入,视图函数代码如下:

from django.views.generic.edit import CreateView
from django.urls import reverse_lazy

from .models import Book

class BookCreateView(CreateView):
    model = Book
    fields = ['title', 'author']
    template_name = 'book_create.html'

    # 重定向URL构建
    def get_success_url(self):
        return reverse_lazy('book_list')

表单类的代码:

from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author']

    # 重定向URL构建
    def get_success_url(self):
        return reverse_lazy('book_list')

在模板文件book_create.html中,可以通过Django模板标签language实现将表单直接渲染为HTML语言。

下面是模板文件的代码:

{% extends "base.html" %}

{% block content %}
<h2>Create A New Blog</h2>

<form action="{% url 'book_create' %}" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

{% endblock %}

例2:基于FormView的表单提交

另一个例子是基于FormView的表单提交。假设我们有一个简单的表单,让用户输入一个数字n来计算1~n的和,并将结果显示到页面上。

表单类的代码如下:

from django import forms

class SumForm(forms.Form):
    n = forms.IntegerField()

对应的视图函数如下:

from django.views.generic.edit import FormView

class SumView(FormView):
    form_class = SumForm
    template_name = 'sum.html'

    # 计算1到n的和
    def calculate_sum(self, n):
        return sum(range(1, n + 1))

    # 处理表单
    def form_valid(self, form):
        n = form.cleaned_data['n']
        sum = self.calculate_sum(n)
        # 计算完后,将结果放到上下文中
        self.success_url = '/sum/{}/'.format(sum)
        return super().form_valid(form)

表单提交完成后,将跳转到一个动态的URL地址,其中包含了计算的结果。页面中可以通过Django的模板语言渲染这个动态地址,并将计算结果显示到页面上。

让我们来看一下对应的模板代码:

{% extends "base.html" %}

{% block body %}
{% if object %}
    <p>{{ object }}</p>
{% endif %}
{% endblock %}

{% block content %}
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>
{% endblock %}

到这里,我们已经了解了get_success_url()函数在Django表单中的应用。无论是基于CreateView还是FormView的表单提交,都可以通过get_success_url()函数支持重定向到指定页面,并且可以灵活地构建动态的URL地址来支持更多的功能。