2014-03-03 21 views
1

我無法在Django中查看模板中的發佈數據。表單數據不會傳遞到Django中查看

從Django中的錯誤信息是:

「CSRF驗證失敗的請求中止。」

這裏是我的代碼:

提交形式:

<form action="/submitted/" method="post"> 
{% csrf_token %} 
    *.... User input some data ....* 
</form> 

結果頁面(test.html中):

<body> 
    {{ passed_dict }} 
</body> 

view.py

from django.core.context_processors import csrf 
from django.template import RequestContext 

def submitted(request): 
    passed_dict = {} 

    if request.method == 'POST': 
     passed_dict.update(csrf(request)) 
     ''' get the data from post and do things ''' 
    else: 
     passed_dict['result'] = 'this_is_result' 

    ## no matter what thing did, back to the original page. 
    return render(request, 'group_detail.html', passed_dict) 

我按照Django網站上的設置指南,但仍然無法正常工作。

我錯過了什麼嗎?

+0

可以在'passed_dict.update(csrf(request))'之後打印passed_dict'。你看到了什麼? –

+0

「CSRF驗證失敗,請求中止。」 –

回答

0

您需要傳回上下文,類似。 (https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext

return render_to_response('my_template.html', 
          passed_dict, 
          context_instance=RequestContext(request)) 
+0

原因是「CSRF令牌丟失或不正確」,我認爲請求沒有成功發送。 –

+0

如果您檢查模板和渲染的工作,從django.template導入上下文,模板 >>> >>> =模板(「我的名字是{{person.first_name }}。「) >>> d = {」person「:{」first_name「:」Joe「,」last_name「:」Johnson「}} >>> t.render(Context(d)) – Anup

+0

對不起,我不明白。 –

0

無需查看POST數據。問題很明顯:您沒有在首先生成表單的視圖中傳遞CSRF令牌。如果它不在生成的表單中,它將不在POST數據中。

Django中的通常模式是使用相同的視圖來生成表單並處理POST,但您似乎已將它們分開。您需要在兩個視圖中傳遞令牌。請注意,通常的做法是使用RequestContext(或render快捷方式),而不是手動將其添加到上下文。

編輯好了,第三次,這個問題是在呈現上獲取表單步驟 - 在你是不是傳遞CSRF令牌。同樣,正如我上面所說的,根本不應該手動添加它,而是使用render快捷鍵來確保上下文處理器運行:render(request, 'group_detail.html', passed_dict)

+0

在Django中使用通常的模式。我在我的表單中設置了'action =「」',並在我的視圖中記下了如果request.method =='POST''生成表單。但它仍然不起作用。是否需要使用Django的表單?或者我可以使用正常的方式來生成表單? –

+0

正如我所說,問題不在於POST步驟。請顯示完整視圖(編輯您的問題)。 –

+0

我已將視圖更改爲已編輯的版本。 –