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

  • Post category:Python

form_valid_redirect()是Django中在处理表单验证时常用的函数,它的作用是将处理后的表单数据保存到数据库中,完成后将页面重定向到指定页面。

使用方法:

在处理表单数据的视图中,需要继承Django中的FormView类,然后重写form_valid()函数并在其中调用form_valid_redirect()函数。在调用时需要传入两个参数:

  1. 第一个参数为要重定向到的URL地址;

  2. 第二个参数为经过验证的表单实例。

例如,如果我们有一个用于添加文章的表单页面,我们可以创建一个视图来处理表单提交,并将页面重定向到新添加的文章页面:

from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from myapp.forms import ArticleForm

class AddArticleView(FormView):
    template_name = 'add_article.html'
    form_class = ArticleForm
    success_url = reverse_lazy('article_list')

    def form_valid(self, form):
        form.save()
        return form_valid_redirect(self.success_url, form)

在这个例子中,我们重写了form_valid()函数并调用了form_valid_redirect()函数。在函数中,我们首先调用了 form.save() 函数将表单数据保存到数据库中。然后,我们使用 form_valid_redirect()函数来重定向到指定的页面,让用户确认他们刚刚添加的文章。

接下来我们来看一下具体的实例:

实例1:使用form_valid_redirect()将用户数据保存到数据库中

假设我们有一个名为UserInfoForm的表单,用于用户信息的收集和处理。用户填写表单后,我们需要保存这些信息到数据库中。

下面是UserInfoForm的定义:

from django import forms

class UserInfoForm(forms.Form):
    first_name = forms.CharField(max_length=100)
    last_name = forms.CharField(max_length=100)
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)

现在,我们需要在视图中处理表单数据。下面是视图的定义:

from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from myapp.forms import UserInfoForm

class UserInfoView(FormView):
    template_name = 'user_info.html'
    form_class = UserInfoForm
    success_url = reverse_lazy('user_info')

    def form_valid(self, form):
        form.save()
        return form_valid_redirect(self.success_url, form)

在这个例子中,我们定义了一个名为UserInfoView的视图,用于显示和处理UserInfoForm。它继承了FormView类,并定义了以下变量:

  • template_name: HTML模板的名称;

  • form_class: 表单类的名称;

  • success_url: 表单提交成功后要重定向到的URL地址。

form_valid()函数中调用了form.save()操作将表单数据保存到数据库中,并使用form_valid_redirect()函数将页面重定向到指定的URL地址。

实例2:使用form_valid_redirect()将帖子数据保存到数据库中

现在我们假设有一个帖子的表单页面,在用户填写完表单后我们需要将这些数据保存到数据库中。

以下是名为PostForm的表单定义:

from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('title', 'content', 'author')

下面是用于创建帖子的视图:

from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import Post
from .forms import PostForm

class PostCreateView(CreateView):
    template_name = 'post_form.html'
    form_class = PostForm
    success_url = reverse_lazy('post_list')

    def form_valid(self, form):
        form.save(commit=False)
        form.instance.user = self.request.user
        form.save()
        return form_valid_redirect(self.get_success_url(), form)

在这个例子中,我们使用了CreateView类来创建视图。我们传递了PostForm作为表单的输入。此外,我们使用了getPostListURL函数来将成功提交表单后重定向到帖子列表页面。

form_valid()函数中,我们调用了form.save()将表单数据保存到数据库中。我们也将commit参数设置为false以避免在保存之前立即提交表单数据。接下来,我们更新了帖子的author字段为当前请求的用户。最后,我们调用了form_valid_redirect()函数将页面重定向到指定的URL地址。

总结一下,form_valid_redirect()函数是Django中非常有用的一个函数,可以帮助我们在处理表单时将数据保存到数据库中,并将页面重定向到指定的URL地址。在使用该函数时,需要传入两个参数:要重定向到的URL地址和经过验证的表单实例。同时,我们可以根据具体需求通过重写类视图的form_valid()函数来实现数据的处理操作。通过以上的两个实例,相信大家对于form_valid_redirect()函数的使用与作用都有了更加清晰的理解。