一尘不染

如何在Django中使用上下文重定向?

django

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

HttpResponseRedirect似乎无法正常工作,因为它只为url提供一个参数,无法与之一起传递字典。

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


阅读 388

收藏
2020-04-02

共2个答案

一尘不染

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

2020-04-02
一尘不染

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

然后可以使用以下命令在模板上呈现消息:

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
            <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
        {% endfor %}
    </ul>
{% endif %}
2020-04-02