2013-08-26 56 views
0

我有一個代碼,有一個CSRF驗證失敗的錯誤,請求中止。 在形式:CSRF驗證錯誤失敗。請求異常終止

<form method="POST" action="/jobb/" class="form-horizontal" id="jobform" name="jform" enctype="multipart/form-data" >{% csrf_token %} 

在views.py

@csrf_exempt 
def jobform(request): 
    if request.method == 'POST': 
     getintable = job(app_id = request.POST['jobid'],start_on = request.POST['starton'], end_on = request.POST['endon'],timeframe = request.POST['timeframe'],odeskid = request.POST['odeskid'],hourlyrate = request.POST['hourlyrate'],assigne = request.POST['assigne'],clientid = request.POST['clientid']) 
     getintable.save() 
     return render_to_response('jobsform.html') 
    else: 
     return render_to_response('interviewform.html') 
+0

您是否在'settings.py'的'MIDDLEWARE_CLASSES'中添加了'django.middleware.csrf.CsrfViewMiddleware'? – 2013-08-26 12:17:31

+0

是的,我添加了'django.middleware.csrf.CsrfViewMiddleware',在settings.py –

+0

你是否在settings.py中設置了'true'' CSRF_COOKIE_SECURE'或'SESSION_COOKIE_SECURE'並且你沒有使用'https'? – danihp

回答

1

你,因爲你沒有返回RequestContext實例得到這個錯誤:正弦你的模板({% csrf_token %})添加CSRF令牌。要解決這個問題,您可以使用Suhail建議的render shortcut;或者您可以將請求上下文作爲第三個參數傳遞給render_to_response

此外,你真的應該使用ModelForm,它會自動化許多人會寫的樣板代碼。

這裏是你的代碼會是什麼樣子:

你會將此代碼放在一個名爲forms.py文件,該文件在同一目錄views.py

from myapp.models import Job 

class JobForm(forms.ModelForm): 
    class Meta: 
     model = Job 

在你views.py,你可以做到以下幾點:

from django.shortcuts import render, redirect 

from myapp.forms import JobForm 

def jobform(request): 
    ctx = {'form': JobForm(request.POST or {})} 
    if request.method == 'POST': 
     if form.is_valid(): 
      form.save() 
      return redirect('/some/url') 
     else: 
      return render(request, 'interviewform.html', ctx) 
    else: 
     return render(request, 'interviewform.html', ctx) 

interviewform.html

<form method="POST" 
     class="form-horizontal" 
     id="jobform" name="jform" enctype="multipart/form-data"> 
     {% csrf_token %} 
     {{ form }} 
     <button type="submit" class="btn btn-primary"></button> 
</form> 
0

嘗試使用渲染,你甚至不需要csrf_exempt裝飾。

from django.shortcuts import render 

def jobform(request): 
    if request.method == 'POST': 
     getintable = job(app_id = request.POST['jobid'],start_on = request.POST['starton'], end_on = request.POST['endon'],timeframe = request.POST['timeframe'],odeskid = request.POST['odeskid'],hourlyrate = request.POST['hourlyrate'],assigne = request.POST['assigne'],clientid = request.POST['clientid']) 
     getintable.save() 
     return render(request,'jobsform.html')   
    return render(request,'interviewform.html') 
+0

可能是OP真正需要該函數的'@ csrf_exempt'。我也很驚訝,並且會提示'@ csrf_protect';)所以可能是表單中的令牌csrf_token也不是必需的 – 2013-08-26 12:32:32

+0

@FoxMaSk如果他添加了@ @ csrf_exempt'那麼他不需要傳遞'{%csrf_token %}'在模板中。 render_to_response是一箇舊版本,它需要context'context_instance = RequestContext(request))'。 – suhailvs

相關問題