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

时间:2010-09-02 06:54:17

标签: django django-urls

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

HttpResponseRedirect似乎不会起作用,因为它只有一个url参数,无法用它传递字典。

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

感谢。

5 个答案:

答案 0 :(得分:68)

request.user.message_set在Django 1.2中已被弃用,自Django 1.4以来已被删除,应使用message framework

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

答案 1 :(得分:22)

请注意,此处建议的答案仅适用于Django&lt; 1.2:

您是否可以控制要重定向到的视图?在这种情况下,您可以在重定向之前将上下文保存在会话中。目标视图可以从会话中获取上下文(并将其删除),并使用它来呈现模板。

如果 only 要求显示消息,则有更好的方法可以执行此操作。您的第一个视图可以使用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 =&gt; 1.2阅读涉及消息的答案

答案 2 :(得分:11)

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

答案 3 :(得分: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, "Error message")

答案 4 :(得分:0)

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

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

另请参阅 how to pass context data with django redirect function?