11

Mam przycisk na stronie x i stronie y, która przekierowuje do strony z. Na stronie z mam formularz, który wymaga wypełnienia. Po zapisaniu chcę przekierować na stronę x lub y (niezależnie od tego, na którym byłem początkowo).Django Przekierowanie do poprzedniego widoku

Zwykle używasz "przekierowania" w widoku i określ stronę, do której chcesz przekierować. Ale co byś zrobił w takim przypadku?

Wszelkie pomysły?

Dzięki!

Odpowiedz

10

Możesz użyć parametrów GET do śledzenia z której strony przybyłeś do strony z. Więc kiedy przyjeżdżasz normalnie do strony z, pamiętamy z której strony przyjechaliśmy. Podczas przetwarzania formularza na stronie z używamy wcześniej zapisanych informacji do przekierowania. Więc:

Przycisk/link na stronie y powinny zawierać parametr, którego wartość jest obecny URL:

<a href="/page_z/?from={{ request.path|urlencode }}" />go to form</a> 

Następnie w widoku page_z użytkownika można przekazać to na szablonie:

def page_z_view(self, request): 
    ... 
    return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None) }) 

oraz w szablonie formularza:

<form action="{% if from %}?next={{ from }}{% endif %}" /> 
... 

Teraz formularz - po przesłaniu - przejdzie na next parametr, który wskazuje, gdzie powrócić, gdy formularz zostanie pomyślnie przesłany. Musimy revist widok, aby wykonać to:

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

więc mój przycisk na stronie y powinno być coś takiego: ? Z jakiegoś powodu, który nie działa. Po pierwsze, moja forma nie jest już zapisywana, nawet jeśli "następny" jest pod moim formularzem jeśli jest prawidłowy .. I jestem przekierowywany na oryginalną stronę powitalną .. chociaż to jest zła strona na początku .. i nawet nie wiem, gdzie to jest mam to od lol .. – JohnnyCash

+1

Zaktualizowałem odpowiedź - dodałem dodatkową/w '

+0

dziękuję :) tylko jedna szybka korekta: w twoim

JohnnyCash

-2

Przechowuj informacje o stronach, które odwiedził użytkownik, aby móc je później odzyskać. Prawdopodobnie najlepszym miejscem na to jest sesja.

2

prośba Django wie, co strona użytkownik pochodzi to:

previous_page = request.META['HTTP_REFERER'] 

Będzie ona zawierać coś takiego:

>>> print(previous_page) 
'http://www.myserver.com/myApp/z' 

Stąd wiesz, skąd pochodzisz (ostrzeżenie, traktuj to jako niebezpieczne dane i weryfikuj je dokładnie, może nawet zawierać złośliwe dane) i korzystaj z tych informacji.

Najpierw przekazać go do szablonu jako

data = { 
    ..., 
    # also indicate, that saved data are valid and user can leave 
    'previous_page': previous_page, 
} 

Render stronę z.html

return render(request, 'myApp/z.html', data) 

I w szablonie strony z, dodać tag metaodświeżania do. Spowoduje to, że gdy formularz zostanie zapisany Strona załadowana, użytkownik zostanie przekierowany z powrotem przekierowany automatycznie:

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

Ma to tę zaletę, że formularz jest zapisywany przez z.html stronie, gdzie jest wypełniona i nie trzeba go traktować na stronach x i y (jest to jedyny sposób, aby zrobić, jeśli strony x i y znajdują się poza aplikacją Django).

Powiązane problemy