get_success_url()是Django框架中常用的一个函数,它在表单提交成功后,将用户重定向到一个指定页面上。
作用
在Django框架中,当用户填写表单并提交后,很多时候不希望用户停留在当前页面,而是需要将其重定向到另一个页面上。get_success_url()函数就是用来实现这个功能的。
具体来说,当用户在表单中填写数据并提交后,框架会执行相应的验证程序,如果验证通过,那么就会执行get_success_url()函数并将用户重定向到指定的页面上。如果验证不通过,那么就会返回一个表单给用户提示出错信息。
使用方法
在Django框架中,使用get_success_url()函数有以下几个步骤:
- 在相关的视图函数中加入get_success_url()函数,该函数接受一个参数
kwargs
,并构建一个重定向的url地址. - 在相应的表单类(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地址来支持更多的功能。