2017-04-14 124 views
2

當我提交表單,我得到以下錯誤:Django的CSRF令牌丟失或不正確的錯誤403

CSRF verification failed

Reason given for failure:

CSRF token missing or incorrect. 

我views.py是:

def name(request): 
    if request.method == 'POST': 
     form=NameForm(request.POST) 
     if form.is_valid(): 
      name=form.cleandata['your_name'] 
      return HttpResponseRedirect('/thanks/',RequestContext(request)) 

    else: 
     form=NameForm() 
    return render_to_response('contact.html') 

我setting.py文件:

MIDDLEWARE = [ 
'django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

我的forms.py文件是:

class NameForm(forms.Form): 
    your_name=forms.CharField(initial='your name',max_length=100) 

我contact.html是:

<form action="/your-name/" method="POST"> 
{% csrf_token %} 
{{form}} 
<input type="submit" value="Submit" /> 
</form> 

urls.py是:

urlpatterns = [ 
url(r'^admin/', admin.site.urls), 
url(r'^search/$', search),url(r'^contact/$',contact), 
url(r'^name/$',name),url(r'^your-name',name),url(r'^thanks/$',thank) 
] 
+0

'返回選擇render_to_response( 'contact.html',{ '形式':形式},context_instance = RequestContext的(請求))'添加這一行insted的的'返回選擇render_to_response( 'contact.html')' –

+0

我對django瞭解不多,但csrf的基本思想是存儲在會話中的值,然後發送到表單以在提交時對其進行評估。 即檢出您的會話設置,並確保它工作正常。 – SaidbakR

+0

render_to_response中的context_instance參數在Django 1.8中已被棄用,並在Django 1.10中被刪除。當使用獲取錯誤:render_to_response()得到了一個意外的關鍵字參數'context_instance' – Tango

回答

2

細節使用render功能來呈現,而不是render_to_response模板。

from django.shortcuts import render 

def name(request): 
    if request.method == 'POST': 
    form = NameForm(request.POST) 
    if form.is_valid(): 
     name = form.cleaned_data['your_name'] 
     return HttpResponseRedirect('/thanks/', RequestContext(request)) 
    else: 
     form = NameForm() 
    return render(request, 'contact.html') 
+0

現在它正在工作,但顯示錯誤爲:'ContactForm'對象沒有屬性'cleandata' – Tango

+1

使用'form.cleaned_data ['your_name']'。沒有名爲'cleandata'的屬性,它的'cleared_data'。 –

0

使用@csrf_protect裝飾。 你可以得到約CSRF here

+0

我確實在名稱(請求)方法上面添加了它:@csrf_protect仍然不能正常工作 – Tango

+0

是的,請在視圖上方使用此方法。 –

+0

從django.views.decorators.csrf進口csrf_protect 從django.shortcuts導入已渲染 @csrf_protect DEF my_view(請求): C = {} #... 返回渲染(請求 「a_template.html」 ,c) –

相關問題