如何在Django模板中重定向并显示消息?
我有一个页面,用来验证和保存一个表单。表单保存后,我想把用户重定向回一个列表页面,并显示一条成功消息,比如“客户xyz的表单已成功更新...”。
但是,HttpResponseRedirect好像不太适合,因为它只接受一个网址作为参数,不能直接传递一个字典。
我尝试修改我的对象列表的包装函数,让它可以接受一个包含必要信息的字典作为参数。然后我在保存表单的视图中调用这个包装函数。但是,当页面渲染时,网址变成了'/customer_form/',而不是'/list_customers/'。我还尝试在把请求对象传给对象列表的包装函数之前修改它,但也没有成功。
谢谢。
6 个回答
15
为了更好地理解Antoine的有用回答:如果你想在你的视图模块中处理消息,而不是在模板中处理:
from django.contrib.messages import get_messages
def my_view(request):
# Process your form data from the POST, or whatever you need to do
# Add the messages, as mentioned above
messages.add_message(request, messages.INFO, form.cleaned_data['name'])
return HttpResponseRedirect('/other_view_url/')
def other_view(request):
storage = get_messages(request)
name = None
for message in storage:
name = message
break
return render(request, 'general/other_view.html', {'name': name})
83
request.user.message_set
在Django 1.2版本中已经不再推荐使用,并且从Django 1.4版本开始就被移除了。现在应该使用消息框架来处理相关功能。
from django.contrib import messages
# messages.add_message(request, level, message, extra_tags='', fail_silently=False)
messages.add_message(request, messages.INFO, "Your Message")
另外,你可以使用快捷函数中的一种:
from django.contrib import messages
messages.debug(request, "Your Message")
messages.info(request, "Your Message")
messages.success(request, "Your Message")
messages.warning(request, "Your Message")
messages.error(request, "Your Message")
然后可以在模板中这样显示消息:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
26
请注意,这里提到的答案只适用于Django版本低于1.2:
你是否能控制你要重定向到的视图?如果可以的话,你可以在重定向之前把上下文保存到会话中。目标视图可以从会话中获取这个上下文(并在使用后删除它),然后用来渲染模板。
如果你唯一的需求是显示一条消息,那么有更好的方法来实现。你的第一个视图可以使用auth
创建一条消息,然后让第二个视图读取并删除这条消息。大致可以这样做:
def save_form(request, *args, **kwargs):
# all goes well
message = _("form for customer xyz was successfully updated...")
request.user.message_set.create(message = message)
return redirect('list_view')
def list_view(request, *args, **kwargs):
# Render page
# Template for list_view:
{% for message in messages %}
...
{% endfor %}
消息会被保存到数据库中。这意味着即使在重定向后你也可以访问它们。它们会在渲染模板时自动被读取并且删除。为了让这个功能正常工作,你需要使用RequestContext
。
对于Django版本大于等于1.2,请查看涉及消息的答案