详解Django的 get_success_message() 函数:获取表单验证成功后的消息

  • Post category:Python

get_success_message()函数是Django中一个用于获取表单操作成功后消息提示的方法。使用该方法可以让我们在表单成功提交后,显示一条提示消息,以告知用户操作是否成功。下面是使用get_success_message()方法的一般步骤:

  1. 在views.py文件中,导入messages并定义一个基于MessageMixin的视图类。

“`python
from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView, UpdateView

class ExampleCreateView(SuccessMessageMixin, CreateView):
“””
create view for example model
“””
model = Example
fields = [‘name’, ‘description’, ‘is_active’]
success_url = ‘/example/’
success_message = “Example created successfully”

class ExampleUpdateView(SuccessMessageMixin, UpdateView):
“””
update view for example model
“””
model = Example
fields = [‘name’, ‘description’, ‘is_active’]
success_url = ‘/example/’
success_message = “Example updated successfully”
“`

  1. 像上面示例代码中一样,在视图类中设置success_message属性和get_success_message()方法。success_message属性用于设置成功提交表单后的提示消息,而get_success_message方法则用于定义该提示消息的生成逻辑。

“`python
class ExampleCreateView(SuccessMessageMixin, CreateView):
“””create view for example model”””
model = Example
fields = [‘name’, ‘description’, ‘is_active’]
success_url = ‘/example/’
success_message = “Example created successfully”

   def get_success_message(self, cleaned_data):
       """
       generate success message after creating a record
       """
       return self.success_message

class ExampleUpdateView(SuccessMessageMixin, UpdateView):
“””update view for example model”””
model = Example
fields = [‘name’, ‘description’, ‘is_active’]
success_url = ‘/example/’
success_message = “Example updated successfully”

   def get_success_message(self, cleaned_data):
       """
       generate success message after updating a record
       """
       return self.success_message

“`

在这个方法中,我们可以访问视图实例的属性和方法,以生成一条和操作相关的成功消息并返回。如果您想添加别的变量来构造此类提示信息,可以在表单操作失败时使用form_invalid方法中添加 messages.add_message`() 来定义该消息。

使用上述实例类定义一个具有get_success_message()方法的视图时,Django就会自动在表单提交成功后生成并显示一个提示信息,如下图所示:

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
            <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
        {% endfor %}
    </ul>
{% endif %}

下面是两个实际使用场景。

  1. 简单的添加/更新记录表单。这个场景允许用户添加记录或者对现有记录进行编辑,当用户提交表单时,如果一切操作成功,就会弹出一条提示信息,提示用户新的记录已经成功添加或现有记录已经成功修改,反之弹出错误提示信息。下面是在添加记录时调用get_success_message()的示例代码。

“`python
class ExampleCreateView(SuccessMessageMixin, CreateView):
model = Example
fields = [‘name’, ‘description’, ‘is_active’]
success_url = ‘/example/’
success_message = “Example created successfully”

   def get_success_message(self, form_cleaned_data):
       name = form_cleaned_data.get('name')
       return f'{name} has been added'

“`

  1. 含有分步操作的多步表单。这时候我们需要在不同表单的各个步骤中显示不同的信息,来提示用户现在在做的是啥以及完成的百分比之类,方式就是调用方法,在表单提交成功后,把提示信息与下一个表单松散联系起来。下面是应用这个场景时调用get_success_message()的实例代码。

“`python
class MultiStepFormView(FormView):
template_name = “example/create.html”
form_list = [
(“step1”, Step1Form),
(“step2”, Step2Form),
(“step3”, Step3Form),
]

   def get_form_initial(self, step):
       if step == "step3":
           # 如果step3表单需要从之前的表单中取得信息,则通过这段代码来获取数据并初始化
           return {"my_info": self.storage.get_step_data("step1").get("my_info")}
       return {}

   def get_success_url(self):
       """
       redirect to success url after successfully submitting the form
       """
       return reverse('example:create')

   def process_step2(self, form):
       """
       method called after successfully submitting step2 form
       """
       # save the information from step 2 form
       self.storage.set_step_data("step2", form.cleaned_data)
       # update step information
       self.storage.current_step = "step3"
       # generate some messages for step3
       messages.success(self.request, "Step2 has been completed successfully")
       messages.success(self.request, "Now you can move to the next step")

   def process_step3(self, form):
       """
       method called after successfully submitting step3 form
       """
       # finally, process the whole form
       self.storage.set_step_data("step3", form.cleaned_data)
       messages.success(self.request, "Multi-step form submitted successfully")

   def get_success_message(self, cleaned_data):
       step = self.steps.current
       if step == "step1":
           # 如果step1表单被提交成功,显示这个提示信息
           return "Step1 has been completed successfully"
       elif step == "step2":
           # 如果step2表单被提交成功,则显示这个提示信息
           return "Step2 has been completed successfully"
       elif step == "step3":
           # 如果step3表单被提交成功,则显示这个提示信息
           return "Multi-step form submitted successfully"

   def done(self, form_list, **kwargs):
       """
       all form fill steps have been processed
       """
       messages.success(self.request, self.get_success_message(None))
       return redirect(self.get_success_url())

“`

这两个实例都说明了,在需要进行数据处理后可以修改text参数,来动态生成相应的提示文字。