详解Django的 form_validated() 函数:表单数据验证通过后的处理逻辑

  • Post category:Python

form_valid() 函数是 Django 中 FormView 类的一个方法,用于处理表单数据验证正确后的处理。具体来说,当表单提交数据验证通过时,FormView 类中的 form_valid() 方法会被调用。

其主要作用是根据验证通过后的表单数据,重定向到指定的 URL 以及保存表单数据到数据库中。

使用方法:

1.定义form_valid()函数

在使用 form_valid() 方法之前,需要定义该方法来处理验证通过后的表单请求。一般情况下,该方法需要重定向到一个 URL,并将表单数据保存到数据库中。

from django.views.generic.edit import FormView

class MyFormView(FormView):
    template_name = 'my_form.html'
    form_class = MyForm  # 在这里定义了一个表单类

    def form_valid(self, form):
        # Do something with `form.cleaned_data`
        # ...

        return super().form_valid(form)

2.保存表单数据到数据库

form_valid() 方法中,可以使用表单的 cleaned_data 属性访问已经被验证过的表单数据。然后,你可以将这些数据保存到数据库中。

例如,当你需要将表单数据保存到一个模型中时,可以使用以下类似的代码:

def form_valid(self, form):
    # Save the data from the form into a new `MyModel` record
    my_model = MyModel.objects.create(
       name=form.cleaned_data['name'],
       email=form.cleaned_data['email'],
       message=form.cleaned_data['message']
    )

    # Redirect to a success page
    return HttpResponseRedirect('/success/')

3.重定向表单提交后的页面

当表单数据验证通过后,用户应该被重定向到一个新的页面。可以使用 form_valid() 方法来实现这一点。

例如,当你需要重定向到另一个 URL 时,可以使用以下代码:

from django.urls import reverse_lazy

class MyFormView(FormView):
    template_name = 'my_form.html'
    form_class = MyForm
    success_url = reverse_lazy('success-page')

    def form_valid(self, form):
        # Save the cleaned data to the database
        # ...

        return super().form_valid(form)

在此示例中,重定向 URL 在 success_url 属性中指定。

下面提供两个具体例子:

  1. 将表单数据保存到数据库中

假设有一个用户反馈表单,用户需要提供反馈者姓名、邮箱和反馈内容,你可以使用 form_valid() 方法将该表单保存到一个模型中。例如:

# forms.py
from django import forms

class FeedbackForm(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

# models.py
from django.db import models

class Feedback(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

# views.py
from django.views.generic.edit import FormView
from django.db import transaction
from .models import Feedback
from .forms import FeedbackForm

class FeedbackView(FormView):
    template_name = 'feedback_form.html'
    form_class = FeedbackForm
    success_url = '/thanks/'

    @transaction.atomic
    def form_valid(self, form):
        feedback = Feedback.objects.create(
            name=form.cleaned_data['name'],
            email=form.cleaned_data['email'],
            message=form.cleaned_data['message']
        )
        return super().form_valid(form)

在此示例中,我们首先通过定义 FeedbackForm 来定义用户反馈表单,然后定义了 Feedback 模型来保存用户反馈。

FeedbackView 中,我们定义了用于处理用户反馈表单的 form_valid() 方法。当表单验证成功后,我们创建一个新的 Feedback 模型对象,并将表单数据保存到该对象中。

  1. 重定向到另一个 URL

假设你有一个登录页面,用户在表单中输入用户名和密码,然后需要被重定向到他们的个人资料页面。可以使用 form_valid() 方法来处理此重定向。

# forms.py
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

# views.py
from django.contrib.auth.views import LoginView
from django.urls import reverse_lazy

class MyLoginView(LoginView):
    template_name = 'login.html'
    form_class = LoginForm
    success_url = reverse_lazy('profile')

    def form_valid(self, form):
        response = super().form_valid(form)
        user = form.get_user()
        return response

在此示例中,我们定义了一个 LoginForm 类来表示用户登录表单。然后,我们使用 MyLoginView 来呈现该表单和处理表单提交。

当表单验证成功后,我们将用户重定向到个人资料页面,该页面在 success_url 属性中定义,即 reverse_lazy('profile')

总之,form_valid() 方法的主要作用是处理表单数据通过验证后的操作,如保存到数据库、重定向到指定页面等。同时,要注意在 form_valid() 方法中添加 Super() 函数来确保默认的表单处理行为实施。