如何在Django中使用上下文redirect?
我有一个视图来validation和保存表单。 表单保存后,我想redirect到一个list_object视图与成功消息“客户xyz表单已成功更新…”
HttpResponseRedirect似乎不会工作,因为它只有一个URL的参数,没有办法传递字典。
我已经尝试修改我的包装object_list采取字典作为具有必要的上下文的参数。 我从保存表单的视图中返回对这个包装器的调用。 但是,当页面呈现时,url是'/ customer_form /'而不是'/ list_customers /'。 我尝试修改请求对象之前,它传递给object_list包装,但没有奏效。
谢谢。
请注意这里build议的答案只适用于Django <1.2:
你是否能够控制你正在redirect的观点? 在这种情况下,您可以在redirect之前将会话保存在会话中。 目标视图可以从会话中获取上下文(并将其删除),并使用它来呈现模板。
如果你唯一的要求是显示一条消息,那么有一个更好的方法来做到这一点。 您的第一个视图可以为当前正在使用的auth
创build一条消息,并让第二个视图读取并删除它。 像这样的东西:
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 %}
消息被保存到数据库。 这意味着即使在redirect之后也可以访问它们。 在渲染模板时会自动读取和删除它们。 你将不得不使用RequestContext
这个工作。
对于Django => 1.2阅读涉及消息的答案
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 %}
要扩展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})