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

60

我有一个验证并保存表单的视图。在表单保存之后,我想重定向回一个名为“list_object”的视图,并带有成功消息“已成功更新客户xyz的表单...”

HttpResponseRedirect似乎不会起作用,因为它只有一个用于URL的参数,没有传递字典的方法。

我尝试修改我的object_list装饰器以接受一个包含必要上下文的字典参数。然后我从保存表单的视图中调用这个wrapper。然而,在渲染页面时,URL变成了“/customer_form/”,而不是“/list_customers/”。我尝试修改请求对象,然后将其传递给object_list包装器,但它没有起作用。

谢谢。


13
给未来的搜索者:一定要阅读超过被接受的答案,因为它已经过时。 - ZAD-Man
6个回答

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 %}

1
我想补充一下,您可以使用 {{ message.level_tag }} 来显示级别标签。例如成功等级别标签,这对于样式化 alert-{{ message.level_tag }} 而言非常有用。 - rptmat57

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,请阅读涉及消息的答案。


11
现在应该接受另一个答案作为正确答案。这在Django 1.2中已被弃用,并在Django 1.4中已被删除(如其他答案所述)。 - Utkarsh Sinha

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})

1
我发现以下内容适用于除了消息之外需要添加到重定向的情况:
from django.shortcuts import redirect
import urllib

def my_view(request):

    ...

    context = {'foo1': bar1, 'foo2': bar2, 'foo3': bar3}
    return redirect('/redirect_link/?' + urllib.parse.urlencode(context))

另请参阅如何使用Django重定向函数传递上下文数据?


1
在Django 2.x +中,您可以简单地使用附带Django的消息框架。

views.py

from django.contrib import messages

def register(request):
    ....
    messages.success(request,"You have registered successfully, now login!")
    return redirect('login-page')

在你的login.html模板中添加以下代码。
  {% if messages %}
    {% for message in messages %}
        <div class="alert alert-success alert-dismissible fade show">
            <strong>Success!</strong> {{message}}
            <button type="button" class="close" data-dismiss="alert">&times;</button>
        </div>
    {% endfor %}
 {% endif %}

请注意,此示例可应用于任何您想要显示成功消息的地方。
如果您想传递错误消息,只需使用messages.error(request,“错误消息”)

0

对于Django管理界面,我可以使用下面展示的多种类型的消息进行重定向:

# "views.py"

from django.contrib import messages # Here
from django.shortcuts import redirect

def my_view(request): 
    messages.debug(request, 'This is debug')
    messages.info(request, 'This is info')
    messages.success(request, 'This is success')
    messages.warning(request, 'This is warning')
    messages.error(request, 'This is error')
    return redirect("http://localhost:8000/admin/store/order/")

但是,我不知道为什么只有"debug" message没有显示,即使在"settings.py""DEBUG = True"

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接