2017-08-03 32 views
1

我正在構建一個網站,我想要各種視圖,要求用戶從我們的頁面請求報價。我想盡可能保持代碼儘可能幹,所以我寫了一個視圖quote,它將接收來自各種視圖的報價請求,並且如果有驗證錯誤重定向回發出請求的頁面。我設法用超級不好的練習'全局變量'來解決這個問題。我需要一個更好的解決方案,我想用當前表單重定向到相應的視圖,這樣我可以迭代form.errors。這裏是我的代碼:發送表單到另一個視圖django

def send_quote(request): 
    form = Quote(request.POST) 
    if form.is_valid(): 
     # do stuff when valid 
     return redirect('Support:thanks', name=name or None) 
    quote_for = request.POST['for_what'] 
    global session_form 
    session_form = form 
    return redirect('Main:' + quote_for) # Here I would like to send form instead of storing in global variable` 

回答

1

您可以使用HttpResponseRedirect函數,並作爲參數傳遞發出請求的頁面。

return HttpResponseRedirect(request.META.get('HTTP_REFERER')) 

所有的META數據存儲在字典中,如果你想了解更多的檢查文檔。

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

+0

我嘗試過,它重定向到發送請求的最後一個頁面,但是重定向後仍然可用的表單? –

+0

'HttpResponseRedirect'是一個類。 –

+0

您可以使用會話來存儲表單,並且您重定向的頁面將正確處理它。 –

0

如果您重定向到引薦,form.errors將是空的,因爲重定向始終是一個GET請求。

我能想到的兩個解決你的問題:

  1. 提交異步使用JavaScript形式等填充錯誤
  2. 使含形成支柱的所有視圖 - 做這將是一個辦法創建一個繼承的基類FormView

第二種選擇是在Django中處理表單的典型方法 - 您在同一個視圖中處理POST和GET。

-1

經過兩天的搜索,我終於找到答案。而不是保存formrequest.session我只保存request.POST,然後重定向。下面是代碼:

def send_quote(request): 
    form = Quote(request.POST) 
    if form.is_valid(): 
     # do stuff when valid 
     return redirect('Support:thanks', name=name or None) 
    quote_for = request.POST['for_what'] 
    request.session['invalid_form'] = request.POST 
    return redirect('Main:endview') 

def endview(request): 
    session_form = request.session.pop('invalid_form', False) 
    if session_form: 
     form = Quote(session_form) 
     # render template again with invalid form ;) 

現在我可以與所有我想要的意見,重複此,只是改變各形式的what_for輸入匹配相應的視圖(如我意)。

+0

如果您的用戶使用多個瀏覽器選項卡,則無法按預期工作。 –

+0

我只是在會話中保存重定向所需的時間。重定向後,我完全從會話中刪除值,除非用戶有權訪問我的服務器並能夠添加斷點,否則它將按預期工作 –

相關問題