Django Перенаправление в предыдущий вид
У меня есть кнопка на странице x и странице y, которая перенаправляется на страницу z.
На странице z у меня есть форма, которая нуждается в заполнении. При сохранении я хочу перенаправить на страницу x или y (в зависимости от того, на каком из них я был на начальном этапе).
Обычно вы используете "переадресацию" в представлении и указываете страницу, на которую хотите перенаправить. Но что бы вы сделали в таком случае?
Любые идеи?
Спасибо!
Ответы
Ответ 1
Вы можете использовать параметры 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)}
Ответ 2
Запрос 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 вы добавляете тег meta-refresh в. Это приведет к тому, что после сохранения формы и загрузки страницы пользователь будет перенаправлен обратно автоматически:
{% if form_is_saved and previous_page %}<meta http-equiv="refresh" content="0; url={{ previous_page }}" />{% endif %}
Это имеет то преимущество, что форма сохраняется на странице z.html, где она заполнена, и вам не нужно обрабатывать ее по страницам x и y (это единственный способ сделать это, если страницы x и y находятся за пределами вашего приложения Django).
Ответ 3
Храните информацию о страницах, которые посетил ваш пользователь, поэтому вы можете получить их позже. Вероятно, лучшее место для этого в сеансе.