2009-09-23 12 views
31

Mam formularz, który przekierowuje do tej samej strony po wprowadzeniu przez użytkownika informacji (aby mogli kontynuować wprowadzanie informacji). Jeśli przesłanie formularza powiedzie się, wracamJak przekazać informacje o kontekście szablonu podczas korzystania z HttpResponseRedirect w Django?

HttpResponseRedirect(request.path) 

co działa poprawnie. Jednak w tym przypadku chciałbym również wyświetlić niektóre wiadomości do użytkownika (np. "Twoje dane zostały zapisane" u góry ekranu). Gdybym nie przekierowywał, właśnie zwróciłbym te wiadomości w słowniku kontekstowym. Jednak przy przekierowaniu nie mogę tego zrobić.

Jak mogę przekazać informacje o szablonie podczas korzystania z HttpResponseRedirect?

To, co próbuję zrobić, wydaje się być niesłychanie powszechne, więc przepraszam, jeśli brakuje mi czegoś oczywistego.

+0

są te zalogowanych? –

+0

Wygląda na to, że ładowanie drugiej strony odbywa się po kolejnym osobnym żądaniu przeglądarki (pierwsza odpowiedź zwraca 302), więc nie można przekazywać informacji tam iz powrotem między widokami, jak można się spodziewać za pomocą HttpResponseRedirect. IMHO, struktura sesji jest najłatwiejszym sposobem przekazywania informacji między żądaniami. –

Odpowiedz

5

Najlepszym sposobem byłoby prawdopodobnie użycie zakodowanego kwerendy na przekierowanym adresie URL ... to podejście starej szkoły.

Można zrobić coś takiego

/page /? M = 1,/page /? M = 2, itd

Można by następnie zanalizować tę zmienną z request.GET w kodzie widok i koncert odpowiednia wiadomość.

6

Nie możesz. HttpResponseRedirect wysyła przekierowanie po stronie klienta (kod stanu HTTP 302) do przeglądarki, a następnie przeglądarka ponownie wysyła kolejną stronę.

Możesz ustawić ciąg kwerendy adresu URL w przekierowaniu, ale będzie on widoczny dla użytkownika i każdego przechwytującego żądania HTTP (tj. Proxy) i dlatego nie nadaje się do poufnych informacji.

+2

co z ramami sesji? –

0

dodać zapisany = 1 do łańcucha zapytania i sprawdzić, czy to z czymś takim?

saved = request.GET.get('saved', False) 
1

Jedynym sposobem, wiem od przekazać żadnych danych z przekierowaniem jest dodanie parametry GET do URL jesteś przejazdem w celu uniknięcia XSS hacki którą chcesz przekazać konkretnej stałej jak:.?

[bieżącej ścieżce jesteś przejazdem w] Message = zapisane

a potem przetworzyć message = zapisanego parametru w programie obsługi ścieżki, którą podałeś.

Nieco bardziej skomplikowanym sposobem byłoby nie przekazywanie danych w przekierowaniu, a zamiast tego używanie czegoś takiego jak http://code.google.com/p/django-notify/ do przechowywania danych sesji, które są wyświetlane użytkownikowi po przekierowaniu.

10

jeśli używasz uwierzytelniania i mają zalogowany użytkownik możesz:

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.message_set.create

GET params są również hackable. Można użyć kwerendy, jak wspomniano w innych odpowiedziach.

Myślę, że najbardziej preferowanym sposobem byłoby użycie struktury sesji.W ten sposób można załadować co chcesz w kontekście i uzyskać

{{ request.session.foo }} 

foo może być wiadomość lub można zrobić:

{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %} 

i inne fajne rzeczy.

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

+0

jak w request.session ['foo'] = 1? –

+0

tak, dla drugiego kodu szablonu. lub, w przypadku pierwszego fragmentu szablonu, można umieścić tam całą wiadomość w zależności od logiki. –

+0

Nigdy nie zdawałem sobie sprawy, jak łatwe są sesje w Django ... Dzięki za sugestię. Użyłem tej metody i działa bardzo dobrze. – nicorellius

0

ze swojego views.py ty hast umieścić klucz/wartość-pair do sesji, a następnie odczytać go z szablonu HTML.

Na przykład:

views.py

# your code here 
request.session['vote'] = 1 
return HttpResponseRedirect(request.path) 

your_template.html

{% ifequal request.session.vote 1 %} 
    <!-- Your action here --> 
{% endifequal %} 
+0

Stara odpowiedź, ale podejrzewam, że coś podobnego może być użyte dla pytania, które zadałem tutaj: http://stackoverflow.com/questions/41317128/using-httpresponseredirect-in-a-django-view-where-context-has -to-be-passed Chciałbym usłyszeć twoje przemyślenia na ten temat, jeśli masz czas :-) –

45

Dla zakończenia i przyszłości, można teraz używać the messages framework. Po zainstalowaniu go:

views.py

from django.contrib import messages 

def view(request): 
    # your code 
    messages.success(request, "Your data has been saved!") 
    HttpResponseRedirect(request.path) 

template.html

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
Powiązane problemy