Django中的form_valid()
函数是在处理表单验证通过时被调用的方法。该函数主要用于处理表单的业务逻辑,该函数需要返回一个HttpResponse对象或者一个重定向到另一个URL的HttpResponse对象。在该函数中,你可以从通过form.cleaned_data
访问表单数据,也可以保存到数据库或发送一些消息,并返回一个HttpResponse对象。
使用方法:
在一个基于类的视图中处理表单验证,需要继承Django内置的FormView类,然后重写form_valid()函数来处理表单验证通过时的操作。具体的方法如下:
- 创建一个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)
- 在模板中使用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
指定的页面。