2010-09-02 24 views
42

我有一個視圖來驗證和保存表單。在保存表單之後,我想重定向回到list_object視圖,並顯示成功消息「客戶xyz的表單已成功更新...」如何使用上下文在Django中重定向?

HttpResponseRedirect似乎不會工作,因爲它只有網址的一個參數,沒有辦法通過它的字典。

我已經嘗試修改object_list的包裝以將字典作爲具有必要上下文的參數。我從保存表單的視圖中返回對這個包裝器的調用。但是,當頁面呈現時,url是'/ customer_form /'而不是'/ list_customers /'。在將它傳遞給object_list包裝器之前,我嘗試修改了請求對象,但那不起作用。

謝謝。

+7

對未來搜索者的提示:請務必閱讀已接受的答案,因爲它現在已被棄用。 – 2014-09-04 16:20:47

回答

19

請注意答案這裏建議只適用於Django的< 1.2:

你對要重定向到視圖控件?在這種情況下,您可以在重定向之前將會話保存在會話中。目標視圖可以從會話中獲取上下文(並將其刪除)並使用它來呈現模板。

如果您的只有要求是顯示一條消息,那麼有一個更好的方法來做到這一點。您的第一個視圖可以爲當前使用auth創建一條消息,並讓第二個視圖讀取並刪除它。類似這樣的:

def save_form(request, *args, **kwargs): 
    # all goes well 
    message = _("form for customer xyz was successfully updated...") 
    request.user.message_set.create(message = message) 
    return redirect('list_view') 

def list_view(request, *args, **kwargs): 
    # Render page 

# Template for list_view: 
{% for message in messages %} 
    ... 
{% endfor %} 

消息被保存到數據庫。這意味着你可以在重定向之後訪問它們。在渲染模板時會自動讀取。你將不得不使用RequestContext這個工作。

對於Django的=> 1.2讀涉及消息

+7

現在可能應該接受其他答案作爲正確的答案。這在django 1.2中已被棄用,並在django 1.4中被刪除(如其他答案中所述)。 – 2014-08-20 17:36:31

57

request.user.message_set在Django 1.2已被廢棄和被去除,因爲Django的1.4,則message framework應改用答案。

from django.contrib import messages 

# messages.add_message(request, level, message, extra_tags='', fail_silently=False) 
messages.add_message(request, messages.INFO, "Your Message") 

消息就可以在模板上呈現有:

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

要擴大安託萬的有用的答案:如果你想在你的看法模塊來處理郵件,而不是模板:

from django.contrib.messages import get_messages 

def my_view(request): 
    # Process your form data from the POST, or whatever you need to do 

    # Add the messages, as mentioned above 
    messages.add_message(request, messages.INFO, form.cleaned_data['name']) 

    return HttpResponseRedirect('/other_view_url/') 

def other_view(request): 
    storage = get_messages(request) 
    name = None 
    for message in storage: 
     name = message 
     break 
    return render(request, 'general/other_view.html', {'name': name}) 
相關問題