详解Django的 form_valid_message() 函数:返回表单验证成功后的消息

  • Post category:Python

form_valid_message() 是 Django中 FormMixin 类的一个方法,用于在表单成功验证后返回一个包含成功信息的 http response,例如重定向到一个页面,并显示提示信息帮助用户理解表单提交成功的结果。

以下是 form_valid_message() 的基本用法:

from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse_lazy
from django.views.generic.edit import FormView
from .forms import ContactForm

class ContactView(SuccessMessageMixin, FormView):

    template_name = 'contact-form.html'
    form_class = ContactForm
    success_url = reverse_lazy('contact')
    success_message = "Thank you for your message!"

    def form_valid(self, form):
        form.send_email()
        return super(ContactView, self).form_valid(form)

    def get_success_message(self, cleaned_data):
        return self.success_message

这个例子展示了如何在表单验证成功后向用户显示一个成功消息。我们有一个 ContactView,它是一个 FormView,有一个 success_message 属性,它包含一个成功消息,该消息将在表单验证成功后向用户显示。

  • 例子1:

为了让例子更具现实意义,我们考虑一个网站上注册的场景。假设我们有一个 RegistrationForm,它验证用户提交的表单并注册新用户。一旦表单通过验证,我们想向用户发送一条提示消息,表示注册成功。我们可以这样做:

(1) 确定成功消息

from django.utils.translation import gettext as _

class RegistrationForm(forms.Form):
    # 省略部分验证
    def signup(self, request, user):
        messages.success(request, _('您已成功注册,用户名为:') + request.POST['username'])

(2) 在视图中使用 form_valid_message() 方法

from django.views.generic.edit import FormView
from django.contrib import messages
from django.urls import reverse_lazy
from .forms import RegistrationForm

class RegisterView(FormView):
    # 省略部分设置
    template_name = 'register.html'
    form_class = RegistrationForm
    success_url = reverse_lazy('login')
    success_message = _('您已成功注册,请登录!') 

    def form_valid(self, form):
        form.save()
        return super(RegisterView, self).form_valid(form)

    def form_valid_msg(self):
        # 发送成功消息
        messages.success(self.request, self.success_message)

        # 返回一个 HTTP 302 重定向到我们 login 页面的操作
        return super().form_valid()

    def get_success_url(self):
        return reverse_lazy('login')

在这个例子中,我们有一个 RegisterView,它是一个 FormView,有一个 success_message 属性,它包含一个成功消息,该消息将在注册成功后向用户显示。在视图中,我们重写了 form_valid_message() 方法,以便在表单验证成功后发送一个成功消息,并重定向到登录页面。

  • 例子2:

假设我们有一个 ContactForm,它验证用户提交的表单以发布联系人信息。一旦表单通过验证,我们想向用户发送一条提示消息,表示提交的信息已成功发布。我们可以这样做:

(1) 确定成功消息

from django.utils.translation import gettext as _

class ContactForm(forms.Form):
    # 省略部分验证
    def send_email(self):
        # 发送邮件(省略代码)
        return _('您的信息已成功发布,谢谢您的回复!')

(2) 在视图中使用 form_valid_message() 方法

from django.views.generic.edit import FormView
from django.contrib import messages
from .forms import ContactForm

class ContactView(FormView):
    # 省略部分设置
    template_name = 'contact.html'
    form_class = ContactForm
    success_url = reverse_lazy('home')
    success_message = _("Thank you for your message! We will be in touch soon.")

    def form_valid(self, form):
        form.send_email()
        return super(ContactView, self).form_valid(form)

    def form_valid_message(self):
        # 发送成功消息
        messages.success(self.request, self.success_message)
        # 返回一个 HTTP 302 重定向到我们 home 页面的操作
        return super().form_valid()

在这个例子中,我们有一个 ContactView,它是一个 FormView,有一个 success_message 属性,它包含一个成功消息,该消息将在联系人信息发布成功后向用户显示。在视图中,我们重写了 form_valid_message() 方法,以便在表单验证成功后发送一个成功消息,并重定向到首页。

总之,form_valid_message() 方法是一个在表单验证成功后向用户展示成功消息的简单而有效的方式。如果你的应用需要展示成功消息,那么这个方法是一个值得学习和使用的技巧。