2009-09-23 34 views
31

我有一個表單在用戶輸入信息後重定向到同一頁面(以便他們可以繼續輸入信息)。如果表單提交成功,我將返回在Django中使用HttpResponseRedirect時,如何傳遞模板上下文信息?

HttpResponseRedirect(request.path) 

它工作正常。但是,在這種情況下,我還想向用戶顯示一些消息(例如,屏幕頂部的「您的數據已保存」)。如果我沒有重定向,我只需在上下文字典中返回這些消息。然而,重定向,我不能這樣做。

那麼在使用HttpResponseRedirect時如何傳遞模板上下文信息呢?

我想要做的事情似乎會非常普遍,所以請原諒我是否缺少明顯的東西。

+0

在這些登錄的用戶? – 2009-09-23 03:37:13

+0

似乎第二個頁面的加載發生在來自瀏覽器的另一個單獨請求之後(第一個響應返回302),因此您不能在視圖之間來回傳遞信息,就像您期望使用HttpResponseRedirect一樣。恕我直言,會議框架是在請求之間傳遞信息的最簡單方式。 – 2012-03-03 03:04:27

回答

5

最好的方法可能是在重定向URL上使用編碼查詢字符串......它是一種老派的方法。

你可以做類似

/頁/?M = 1,/頁/?M = 2等

然後,您可以解析變量,在request.GET中視圖代碼,並顯示適當的消息。

6

你不能。 HttpResponseRedirect將客戶端重定向(HTTP狀態碼302)發送到瀏覽器,然後瀏覽器重新請求另一個頁面。

您可以在重定向上設置一個URL查詢字符串,雖然這對用戶和任何攔截HTTP請求(即代理)的用戶都是可見的,因此不適用于敏感信息。

+2

會話框架呢? – 2009-09-23 20:39:03

0

您添加保存= 1到查詢字符串,並檢查它的東西,如:

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

我知道要通過什麼數據與重定向的唯一方式是讓參數添加到URL你傳遞以避免XSS黑客你想傳遞像一個特定的常數:?

[你傳遞在當前路徑]消息=保存

,然後處理消息=保存的參數在你通過的路徑的處理程序中。

稍微複雜一點的方式是不會將數據傳遞到重定向中,而是使用類似http://code.google.com/p/django-notify/的東西來存儲基於會話的數據,這些數據在重定向後顯示給用戶。

10

如果您正在使用身份驗證,並在用戶你可以登錄一個:

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

GET PARAMS也容易被破解。查詢字符串,如其他答案中所述,可以使用。

我認爲最好的方式是使用會話框架。這樣,你可以加載任何你的背景下,希望並獲得

{{ request.session.foo }} 

foo可能是消息或者你可以這樣做:

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

和其他有趣的東西。

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

+0

如request.session ['foo'] = 1?對於第二個模板代碼,是 – 2011-09-09 15:04:51

+0

是的。或者,對於第一個模板片段,您可以根據邏輯將整個消息放在那裏。 – 2011-09-09 15:28:40

+0

我從來沒有意識到在Django中使用會話有多簡單......感謝您提出這個建議。我已經使用這種方法,它工作得很好。 – nicorellius 2014-02-20 04:06:03

0

從你views.py你有道上把一個鍵/值對到會話,然後從HTML模板讀它。

例如:

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

舊的答案,但我懷疑這樣的事情可以用於我在這裏問的問題:http://stackoverflow.com/questions/41317128/using-httpresponseredirect-in-a-django-view-where-context-has如果你有時間的話,很想聽聽你的想法:-) – 2016-12-24 22:35:03

45

完成和將來參考的緣故,你現在可以使用the messages framework。你安裝它之後:

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 %} 
相關問題