如何在Django模板中重定向并显示消息?

61 投票
6 回答
57160 浏览
提问于 2025-04-16 03:37

我有一个页面,用来验证和保存一个表单。表单保存后,我想把用户重定向回一个列表页面,并显示一条成功消息,比如“客户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,请查看涉及消息的答案

撰写回答