2015-08-28 35 views
1

我試圖將我的註冊表單重定向到同一個表單後保存值也我想在重定向響應中返回一個字典。 但以下代碼無法正常工作。Django - 字典傳遞重定向沒有顯示在模板

urls.py

url(r'^signupform/$', views.render_signup, name='render_signup'), 
url(r'^signup/$', views.sign_up_account_admin, name='sign_up_account_admin'), 

views.py

def render_signup(request): 
    """ 
    """ 
    data_dict = {"some_keys":"some_values"} 
    return render(request, "admin.html", data_dict) 



def sign_up_account_admin(request): 
    """ 
    """ 
    user = None 
    user, msg = save_form_data(request) 
    req_dict = {"msg": msg} 
    if user: 
     ret = redirect('homepage') #-- This works pretty fine 
    else: 
     ret = redirect('/signupform/', resp = req_dict) #-- This redirects but I don't get the `resp` Objects in the template 
    return ret 

的Html Temlpate

<div class="container"> 
     =={{resp}} 
     ===>>>>>>>{{resp.msg}} 
    </div> 

和輸出HTML

<div class="container"> 
     == 
     ===>>>>>>> 
    </div>   
+0

'redirect()'不會將其參數傳遞給模板。這就像你對指定的網址發出新的請求。如果需要,您可以在查詢參數或會話中傳遞數據。 –

+0

@YaroslavAdmin - 我想,因爲我們可以通過在'reverse'方法中傳遞kwargs使用'HttpResponseredirect'來實現這一點。我們有這樣的其他選擇嗎? – Laxmikant

+0

是的,如果你的url被定義爲'/ some-url/{id} /',那麼比'kwargs'傳遞給'reverse'會填充'{id}'部分。這些是完全不同的東西。 –

回答

3

您無法將隨機kwargs傳遞給redirect函數。

傳遞給redirect的參數與您在使用reverse()生成url時所傳遞的位置或關鍵字參數相同。這些參數用於反向解析url。

如Django文檔有關使用redirect() function.

通過傳遞一個視圖的名稱和任選的一些位置或 關鍵字參數提到;該URL將使用 reverse()方法反向解析。

現在,當您傳遞一個硬編碼的url時,與它一起傳遞的參數將被丟棄。

在Django文檔中提到使用redirect()用硬編碼網址推薦的方法是:

def my_view(request): 
    ... 
    return redirect('/some/url/') 

所以,你現在可以做的是使用Django的會話或可能傳遞參數中的URL在render_signup視圖中訪問resp的值。

解決方案-1使用Django會議

一種方法是使用Django會議得到msg

def sign_up_account_admin(request): 
    """ 
    """ 
    user = None 
    user, msg = save_form_data(request) 
    req_dict = {"msg": msg} 
    if user: 
     ret = redirect('homepage') #-- This works pretty fine 
    else: 
     request.session['resp'] = msg # set in session 
     ret = redirect('/signupform/') 

    return ret 

然後在你的render_signup視圖,你可以這樣做:

def render_signup(request): 
    """ 
    """ 
    resp = request.session.get('resp') # get the value from session 
    data_dict = {'resp': resp, ..} 
    return render(request, "admin.html", data_dict) 

解決方案-2將它作爲URL參數

另一種解決方案是把該URL傳遞的查詢參數。

ret = redirect('/signupform/?resp=%s'%msg) # pass as query parameter 

然後在render_signup來看,從request.GET得到這個值。

resp = request.GET.get('resp') # get the value of 'resp' from request.GET 
data_dict = {'resp':resp, ..} 

編輯:

如果你有多個參數要發送的是一本字典,那麼你可以使用urllib.urlencode()編碼字典,並與URL發送。

encoded_string = urllib.urlencode(my_dict) 
redirect('/signupform/?%s'%encoded_string) # attach the encoded string in the url 

然後在您的視圖中,您可以從request.GET中檢索字典的鍵。

value1 = request.GET.get('key1') 
value2 = request.GET.get('key2') 
+0

感謝您的回答。但我有一個相當大的字典可以返回,因此不宜在會話中存儲大字典。所以我會採用其他解決方案。 :( – Laxmikant

+0

您可以將字典編碼爲'percent-encoded'字符串並將其與url一起傳遞。更新了ans。 –