繁体   English   中英

如何重定向消息以在 Django 模板中显示它们?

[英]How to redirect with messages to display them in Django Templates?

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

HttpResponseRedirect 似乎不起作用,因为它只有 url 的参数,无法通过它传递字典。

我尝试修改 object_list 的包装器,以将 dict 作为具有必要上下文的参数。 我从保存表单的视图内部返回对此包装器的调用。 但是,在呈现页面时,url 是“/customer_form/”而不是“/list_customers/”。 在将请求传递给 object_list 包装器之前,我尝试修改请求 object,但这不起作用。

谢谢。

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

请注意这里建议的答案仅适用于 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 阅读涉及消息的答案

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

如果需要向重定向添加的不仅仅是一条消息,我发现以下方法可以工作:

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 重定向功能传递上下文数据?

在 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, "Error message")

Django Admin ,我可以使用几种类型的消息重定向,如下所示:

# "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/")

但是,我不知道为什么即使“settings.py”中的“DEBUG = True”也只显示“debug”消息

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM