11

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

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

Любые идеи?

Спасибо!

ответ

10

Вы можете использовать параметры GET для отслеживания, с какой страницы вы пришли на страницу z. Поэтому, когда вы обычно прилетаете на страницу z, мы помним, с какой страницы мы пришли. Когда вы обрабатываете форму на странице z, мы используем эту ранее сохраненную информацию для перенаправления. Итак:

Кнопка/ссылка на страницу у должна включать параметр, значение которого является текущий 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, который указывает, куда следует возвращаться после успешной отправки формы. Нам нужно revist вид для выполнения этого:

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)} 
+0

так что моя кнопка на странице у должно быть что-то вроде этого: <тип = "кнопка" входное значение = "Добавить" OnClick = "location.href = '/ page_z от =% 2Fpage_y?"> ? По какой-то причине это не работает. Во-первых, моя форма больше не сохраняется, хотя «следующий» находится под моей формой if. И меня перенаправляют на исходную страницу приветствия .. хотя это неправильная страница для начала. Я даже не знаю, где это получил это от lol .. – JohnnyCash

+1

Я обновил ответ - я добавил лишний/в '

+0

спасибо :) только одна быстрая коррекция: в вашем JohnnyCash

-2

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

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) 

И в шаблоне страницы г, добавьте мета-тег обновления на. Это приведет к тому, что после того, как форма будет сохранена и страница загружена, пользователь будет перенаправлен перенаправлены обратно автоматически:

{% if form_is_saved and previous_page %}<meta http-equiv="refresh" content="0; url={{ previous_page }}" />{% endif %} 

Это имеет то преимущество, что форма сохраняется на странице z.html, где она заполнена, и вы не нужно обрабатывать его с помощью страниц x и y (это единственный способ сделать это, если страницы x и y находятся вне вашего приложения Django).

Смежные вопросы