详解Django的 form_valid() 函数:当表单验证成功时执行的操作

  • Post category:Python

Django 中有一个名为 form_valid() 的视图函数,在处理表单数据时非常有用。下面我来详细讲解一下该函数的作用与使用方法。

一、作用

form_valid() 函数在表单数据验证通过后被调用,可以对验证通过的数据进行处理。在该函数中可以使用表单数据,也可以使用视图中定义的其他数据,使用时需要在类视图中集成 FormMixin,即 class MyView(FormMixin, View):。

二、使用方法

form_valid() 函数默认重定向到 success_url 指定的页面,可以通过该函数实现自定义的处理。函数的返回值决定了重定向的地址,应返回一个 HTTPResponse 对象(通常是重定向到某个页面)。该函数接受一个表单对象 form,通过 form.cleaned_data 获取验证通过的表单数据。

下面提供两个示例:

示例1:表单提交新建数据

假设我们在网站中添加了一个博客功能,用户可以提交新的博客文章。当用户提交表单时,我们需要将表单提交的数据存储到数据库中。代码如下:

from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from .forms import BlogForm
from .models import Blog

class BlogCreateView(FormView):
    template_name = 'blog_create.html'
    form_class = BlogForm
    success_url = reverse_lazy('blog_list')

    def form_valid(self, form):
        blog = Blog()
        blog.title = form.cleaned_data['title']
        blog.content = form.cleaned_data['content']
        blog.save()
        return super().form_valid(form)

在该代码中,我们创建了一个 BlogCreateView 类视图,该视图展示一个名为 blog_create.html 的模板,使用的表单类是 BlogForm,当表单验证通过时,调用 form_valid() 函数。在该函数中,我们新建一个 Blog 对象,并将验证通过的表单数据赋值给该对象,最后将该对象保存到数据库中。

示例2:在表单提交时增加操作日志

假设我们需要记录每次表单操作的日志,包括表单提交的数据和提交人等信息。我们可以通过覆盖 form_valid() 函数实现该功能。代码如下:

from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from .forms import BlogForm
from .models import Blog, Log

class BlogCreateView(FormView):
    template_name = 'blog_create.html'
    form_class = BlogForm
    success_url = reverse_lazy('blog_list')

    def form_valid(self, form):
        blog = Blog()
        blog.title = form.cleaned_data['title']
        blog.content = form.cleaned_data['content']
        blog.save()

        log = Log()
        log.action = 'create'
        log.object_type = 'blog'
        log.object_id = blog.id
        log.data = {
            'title': blog.title,
            'content': blog.content,
            'created_by': self.request.user.username
        }
        log.save()

        return super().form_valid(form)

在该代码中,我们在表单提交后,新建了一个 Log 对象,并将日志信息(包括表单数据和提交人等信息)记录在该对象中。注意,该代码中使用了 Django 自带的授权系统,通过 self.request.user 获取当前用户信息。

三、总结

Django 中的 form_valid() 函数在处理表单数据时非常有用。在该函数中,我们可以对表单数据进行处理,并根据需要增加一些操作,例如将数据存储到数据库中,记录操作日志等。对于想要深入了解 Django 的用户,掌握好该函数的使用方法是非常必要的。