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

  • Post category:Python

Django中的form_valid()函数是在使用类视图(Class-Based Views)时,用于处理表单(Form)数据的一个默认处理函数。它主要的作用是将表单的数据绑定到一个ModelForm对象上,然后利用这个对象去更新或保存数据库中的数据。

通常情况下,当用户提交表单时,我们需要对表单中的数据进行一些验证以确保数据的正确性。如果验证通过,我们需要将数据保存到数据库中。这个过程可以通过继承Django中提供的FormView视图,并重写其中的form_valid()函数,在函数中编写处理数据的逻辑来实现。

下面我们来看一个表单保存到数据库的例子:

from django.views.generic import FormView
from .models import Book
from .forms import BookForm

class BookCreateView(FormView):
    template_name = 'book_create.html'
    form_class = BookForm
    success_url = '/book/'

    def form_valid(self, form):
        # 将表单的数据绑定到ModelForm对象
        book_obj = form.save(commit=False)
        # 获取用户输入的数据
        title = form.cleaned_data['title']
        author = form.cleaned_data['author']
        publisher = form.cleaned_data['publisher']
        # 将数据保存到数据库中
        book_obj.title = title
        book_obj.author = author
        book_obj.publisher = publisher
        book_obj.save()
        return super().form_valid(form)

在上述代码中,BookCreateView是继承自FormView的一个视图。我们在视图中定义了form_class属性,它指定了要使用的表单类。而form_valid()函数则是在表单提交并且验证成功的情况下被调用,我们在函数中获取用户输入的数据,并将数据保存到数据库中。

此外,form_valid()函数还可以用来实现其他功能。下面我们来看一个例子:

class ContactUsView(FormView):
    template_name = 'contact_us.html'
    form_class = ContactUsForm
    success_url = '/thank-you/'

    def form_valid(self, form):
        # 发送电子邮件
        email = form.cleaned_data['email']
        name = form.cleaned_data['name']
        message = form.cleaned_data['message']
        send_mail(
            'New Contact Us Message',
            'Name: {}\nEmail: {}\nMessage: {}'.format(name, email, message),
            'noreply@your-site.com',
            ['admin@your-site.com'],
            fail_silently=False,
        )
        # 将表单的数据绑定到ModelForm对象
        contact_us_obj = form.save(commit=False)
        # 将数据保存到数据库中
        contact_us_obj.save()
        return super().form_valid(form)

在上述代码中,我们实现了一个联系我们表单,并且在用户提交表单之后发送了一封电子邮件。在form_valid()函数中,我们使用Django内置的send_mail()函数发送了邮件,并将表单的数据保存到数据库中。这个例子展示了form_valid()函数可以实现更多的操作,不仅仅是数据的保存。