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

  • Post category:Python

Django中的form_valid()函数是在处理表单验证通过时被调用的方法。该函数主要用于处理表单的业务逻辑,该函数需要返回一个HttpResponse对象或者一个重定向到另一个URL的HttpResponse对象。在该函数中,你可以从通过form.cleaned_data访问表单数据,也可以保存到数据库或发送一些消息,并返回一个HttpResponse对象。

使用方法:

在一个基于类的视图中处理表单验证,需要继承Django内置的FormView类,然后重写form_valid()函数来处理表单验证通过时的操作。具体的方法如下:

  1. 创建一个Form类,在views.py中引入Form类,然后在视图中使用这个Form类。
from django import forms

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

from django.views.generic.edit import FormView

class LoginView(FormView):
    form_class = LoginForm
    template_name = 'login.html'
    success_url = '/'

    def form_valid(self, form):
        # 处理验证成功后的逻辑, 比如保存数据
        return super().form_valid(form)
  1. 在模板中使用form表单,指明该表单Post的地址。
<form method="post" action="{% url 'login' %}">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>

以上两个示例代码分别是一个基于类的视图和一个Form类。这里我们创建了一个简单的LoginForm表单,然后使用FormView类创建了一个LoginView视图。我们在视图类中使用form_class指定了我们创建的表单,使用template_name指定了渲染的模板,使用success_url指定了表单验证成功后的重定向地址。最重要的是,我们重写了form_valid函数来处理表单验证通过之后的业务逻辑。

例子1:
假设我们的LoginForm表单验证成功后需要从数据库中获取用户信息,并显示在页面上,可以如下实现。

from django.shortcuts import render
from django.views.generic.edit import FormView
from .forms import LoginForm
from django.contrib.auth.models import User

class LoginView(FormView):
    template_name = 'login.html'
    form_class = LoginForm
    success_url = '/'

    def form_valid(self, form):
        user = User.objects.get(username=form.cleaned_data["username"])
        context = self.get_context_data()
        context["user"] = user
        return render(self.request, self.template_name, context)

在这个例子中,我们在form_valid函数中使用了form.cleaned_data来获取表单数据,从数据库中取出了对应的用户,然后将其保存到context字典中并在render函数中传递给模板。

例子2:
假设我们的LoginForm表单验证成功后需要重定向到其他页面,只需要在form_valid函数中返回HttpResponseRedirect对象。代码例如下。

from django.urls import reverse_lazy
from django.views.generic.edit import FormView
from .forms import LoginForm
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect

class LoginView(FormView):
    template_name = 'login.html'
    form_class = LoginForm
    success_url = reverse_lazy("home")

    def form_valid(self, form):
        user = User.objects.get(username=form.cleaned_data["username"])
        # 处理自己的逻辑

        response =  super().form_valid(form)
        return HttpResponseRedirect(self.get_success_url())

在这里,我们在form_valid函数中使用super().form_valid(form)来调用父类的方法,生成一个HttpResponse对象,然后将其转换为HttpResponseRedirect对象并重定向到success_url指定的页面。