get_success_message()
函数是Django中一个用于获取表单操作成功后消息提示的方法。使用该方法可以让我们在表单成功提交后,显示一条提示消息,以告知用户操作是否成功。下面是使用get_success_message()
方法的一般步骤:
- 在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”
“`
- 像上面示例代码中一样,在视图类中设置
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 %}
下面是两个实际使用场景。
- 简单的添加/更新记录表单。这个场景允许用户添加记录或者对现有记录进行编辑,当用户提交表单时,如果一切操作成功,就会弹出一条提示信息,提示用户新的记录已经成功添加或现有记录已经成功修改,反之弹出错误提示信息。下面是在添加记录时调用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'
“`
- 含有分步操作的多步表单。这时候我们需要在不同表单的各个步骤中显示不同的信息,来提示用户现在在做的是啥以及完成的百分比之类,方式就是调用方法,在表单提交成功后,把提示信息与下一个表单松散联系起来。下面是应用这个场景时调用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参数,来动态生成相应的提示文字。