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

  • Post category:Python

form_valid_message()是Django中FormView类中的一个方法,用于在表单提交成功后显示的成功消息。这个方法返回一个字符串,将在重定向后显示给用户。在这个方法中,可以使用self.object引用表单中已成功保存到数据库的对象。如果表单未实例化,将返回None。下面是使用方法详解与实例说明:

使用方法

1. 编写form_valid_message()方法

在使用FormView视图类时,可以自定义form_valid_message()方法以根据需要自定义成功消息。比如,你想要在成功提交之后直接进行重定向,则可以使用以下自定义消息:

class MyFormView(FormView):
    # ...

    def form_valid_message(self):
        return "您的评论已成功提交!"

如果某个表单需要将已保存对象的名称包括在成功消息中,则可以使用以下自定义消息:

class CommentCreateView(CreateView):
    # ...

    def form_valid_message(self):
        return f"您的评论 \"{self.object.content}\" 已成功提交!"

2. 设置成功消息

FormView视图中,默认情况下,成功消息将以form_valid_message()方法的返回值为基础。如果您需要设置自己的成功消息,可以将success_url属性设置为包含success_message参数的URL。

比如,当用户成功提交表单后,跳转到成功页面并显示消息,则可以这样设置:

class MyFormView(FormView):
    # ...
    success_url = reverse_lazy('success')

    def form_valid(self, form):
        # ... 
        return super().form_valid(form)

    def get_success_url(self):
        return f"{super().get_success_url()}?success_message={self.form_valid_message()}"

reverse_lazy是Django中包含URL名称的反向解析函数,它将URL名称作为参数,并将其转换为URL路径。get_success_url()方法返回一个URL,这个URL包括了success_message参数,该参数值是form_valid_message()方法返回的字符串。

3. 在模板中显示成功消息

最后,在模板中,可以使用django.contrib.messages来显示成功消息。下面是一个简单的HTML模板:

{% extends 'base.html' %}

{% block content %}
  <div class="alert alert-success">
    {{ success_message }}
  </div>
{% endblock %}

可以看到,我们使用了success_message变量来显示成功消息,这个变量实际上就是从URL中获取的success_message参数。如果该参数不存在,则显示为空字符串。

实例说明

实例1:表单提交成功后自动跳转并显示成功信息

假设有一个“Feedback”表单,用户可以输入反馈信息并提交。当用户成功提交反馈信息后,需要自动跳转到成功页面,并显示一个成功消息。

以下是相关的代码:

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

class FeedbackView(FormView):
    form_class = FeedbackForm
    success_url = reverse_lazy('feedback_success')
    template_name = 'feedback.html'

    def form_valid(self, form):
        form.save()
        messages.success(self.request, self.form_valid_message())
        return super().form_valid(form)

    def form_invalid(self, form):
        messages.error(self.request, '提交出错,请重试')
        return super().form_invalid(form)

    def form_valid_message(self):
        return "您的反馈信息已成功提交!"

在这个例子中,我们使用了messages模块向页面上下文添加消息,在模板中使用{% messages %}标签显示。在form_valid()方法中,当成功提交时,使用messages.success()方法将成功消息添加到页面上下文中。同时,在form_invalid()中,如果表单验证失败,则使用messages.error()方法。form_valid_message()方法返回反馈成功时要显示的消息。

实例2:表单提交成功后返回一个包含成功消息的JSON响应

假设有一个”Subscription”表单,用户在其中输入姓名和邮箱地址。当用户成功提交信息后,需要返回一个JSON响应,将记录添加到数据库中,并包含成功消息。

以下是相关的代码:

from django.views.generic.edit import CreateView
from django.http import JsonResponse
from .forms import SubscriptionForm

class SubscriptionCreateView(CreateView):
    model = Subscription
    form_class = SubscriptionForm

    def form_valid(self, form):
        response = super().form_valid(form)
        return JsonResponse({
            'success': True,
            'message': self.form_valid_message(),
            'object': {
                'id': self.object.id,
                'name': self.object.name,
                'email': self.object.email,
            }
        })

    def form_invalid(self, form):
        response = super().form_invalid(form)
        return JsonResponse({
            'success': False,
            'errors': form.errors,
        })

    def form_valid_message(self):
        return "您已成功订阅我们的邮件服务。感谢您的支持!"

在这个例子中,我们使用JsonResponse类在表单成功提交时返回一个JSON响应。在form_valid()方法中,我们返回一个包含成功消息和新添加的对象的JSON响应。在form_invalid()方法中,我们返回一个包含错误的JSON响应。form_valid_message()方法返回要在JSON响应中包含的成功消息字符串。