【发布时间】:2012-03-10 04:40:57
【问题描述】:
我在页面 x 和页面 y 上有一个重定向到页面 z 的按钮。 在第 z 页,我有一个需要填写的表格。保存后,我想重定向到页面 x 或 y(无论我最初在哪个页面上)。
通常,您在视图中使用“重定向”,并指定要重定向到的页面。但是遇到这种情况你会怎么做呢?
有什么想法吗?
谢谢!
【问题讨论】:
标签: django django-models django-forms django-templates django-views
我在页面 x 和页面 y 上有一个重定向到页面 z 的按钮。 在第 z 页,我有一个需要填写的表格。保存后,我想重定向到页面 x 或 y(无论我最初在哪个页面上)。
通常,您在视图中使用“重定向”,并指定要重定向到的页面。但是遇到这种情况你会怎么做呢?
有什么想法吗?
谢谢!
【问题讨论】:
标签: django django-models django-forms django-templates django-views
存储有关您的用户访问过的页面的信息,以便您以后检索它。可能最好的地方就是在会话中。
【讨论】:
您可以使用 GET 参数来跟踪您从哪个页面到达页面 z。因此,当您正常到达第 z 页时,我们会记住我们来自哪个页面。当您在第 z 页处理表单时,我们会使用之前保存的信息进行重定向。所以:
页面 y 上的按钮/链接应包含一个参数,其值为当前 URL:
<a href="/page_z/?from={{ request.path|urlencode }}" />go to form</a>
然后在 page_z 的视图中,您可以将其传递给模板:
def page_z_view(self, request):
...
return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None) })
在您的表单模板中:
<form action="{% if from %}?next={{ from }}{% endif %}" />
...
所以现在表单 - 在提交时 - 将传递一个 next 参数,该参数指示表单成功提交后返回的位置。我们需要修改视图来执行此操作:
def page_z_view(self, request):
...
if request.method == 'POST':
# Do all the form stuff
next = request.GET.get('next', None)
if next:
return redirect(next)
return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None)}
【讨论】:
<form action ... 中添加了一个额外的 /。这里有两个阶段。一个当您最初到达空表单页面并且您到达的 URL 嵌入在 <form action=... 中以在第二阶段提取时 - 当表单实际提交时。有点难以解释!请记住,您的view_z 被执行了两次——第一次到达时,第二次提交时
Django 请求知道用户来自哪个页面:
previous_page = request.META['HTTP_REFERER']
它将包含以下内容:
>>> print(previous_page)
'http://www.myserver.com/myApp/z'
因此您知道您来自哪里(警告,将其视为不安全数据并彻底验证,它甚至可能包含恶意数据)并使用这些信息。
首先你将它传递给模板
data = {
...,
# also indicate, that saved data are valid and user can leave
'previous_page': previous_page,
}
渲染页面 z.html
return render(request, 'myApp/z.html', data)
在页面 z 的模板中,您将元刷新标签添加到 .这将导致一旦保存表单并加载页面,用户将被重定向自动重定向回来:
{% if form_is_saved and previous_page %}<meta http-equiv="refresh" content="0; url={{ previous_page }}" />{% endif %}
这样做的好处是,该表格由页面 z.html 保存,在该页面中填写,您不需要通过页面 x 和 y 处理它(如果页面 x 和 y,这是唯一的方法在您的 Django 应用程序之外)。
【讨论】: