问题 Django重定向到以前的视图


我在页面x和页面y上有一个按钮,重定向到页面z。 在页面z,我有一个需要填写的表单。保存后,我想重定向到第x页或第y页(无论我最初使用哪一个)。

通常,您在视图中使用“重定向”,并指定要重定向到的页面。但是在这样的情况下你会怎么做?

有任何想法吗?

谢谢!


4304
2018-02-19 16:38


起源



答案:


您可以使用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)}

11
2018-02-19 16:48



所以我在页面y上的按钮应该是这样的:<input type =“button”value =“Add”onClick =“location.href ='/ page_z?from =%2Fpage_y'”>?由于某种原因,这是行不通的。首先,我的表单不再保存,即使“下一个”在我的if表单下有效..我正被重定向到原始的欢迎页面..虽然这是错误的页面开始..我甚至不知道它在哪里得到了大声笑.. - JohnnyCash
我已经更新了答案 - 我已经添加了额外的/在 <form action ...。这里有两个阶段。一,当你最初到达空表单页面时,你到达的URL嵌入在 <form action=... 在第二阶段 - 实际提交表格时提取。这有点难以解释!记住你的 view_z 正在执行两次 - 首先是在抵达时,第二次是在提交时 - Timmy O'Mahony
谢谢:)只有一个快速修正:在你的<form action =“.....这是{%endif%}没有endform ..我确定这只是一个错字!做得好!再次感谢 - JohnnyCash


答案:


您可以使用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)}

11
2018-02-19 16:48



所以我在页面y上的按钮应该是这样的:<input type =“button”value =“Add”onClick =“location.href ='/ page_z?from =%2Fpage_y'”>?由于某种原因,这是行不通的。首先,我的表单不再保存,即使“下一个”在我的if表单下有效..我正被重定向到原始的欢迎页面..虽然这是错误的页面开始..我甚至不知道它在哪里得到了大声笑.. - JohnnyCash
我已经更新了答案 - 我已经添加了额外的/在 <form action ...。这里有两个阶段。一,当你最初到达空表单页面时,你到达的URL嵌入在 <form action=... 在第二阶段 - 实际提交表格时提取。这有点难以解释!记住你的 view_z 正在执行两次 - 首先是在抵达时,第二次是在提交时 - Timmy O'Mahony
谢谢:)只有一个快速修正:在你的<form action =“.....这是{%endif%}没有endform ..我确定这只是一个错字!做得好!再次感谢 - JohnnyCash


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应用程序)。


2
2018-06-05 16:23





存储有关您的用户访问过的网页的信息,以便日后检索。可能最好的地方就是在会议中。


-3
2018-02-19 16:41