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

Храните информацию о страницах, которые посетил ваш пользователь, поэтому вы можете получить их позже. Вероятно, лучшее место для этого в сеансе.