Джанго Перенаправить на предыдущий вид - PullRequest
11 голосов
/ 19 февраля 2012

У меня есть кнопка на странице x и странице y, которая перенаправляет на страницу z.На странице z у меня есть форма, которую нужно заполнить.После сохранения я хочу перенаправить на страницу x или y (какую бы я ни был изначально).

Обычно вы используете «перенаправление» в представлении и указываете страницу, на которую хотите перенаправить.Но что бы вы сделали в таком случае?

Есть идеи?

Спасибо!

Ответы [ 3 ]

11 голосов
/ 19 февраля 2012

Вы можете использовать параметры 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 голосов
/ 05 июня 2016

Запрос 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).

0 голосов
/ 19 февраля 2012

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

...