2012-01-26 32 views
1

你好,先謝謝你。這是從下列線(不知道我是否應該已經發布有或啓動一個新的線程的後續問題...:csrf令牌跟進

CSRF token missing or incorrect even though I have {% csrf_token %}

我不知道我需要的代碼做讓csrfContext工作,我想使用的ModelForm收集數據的模型,並將其寫入到一個MySQL表我gettingthe錯誤:。

Reason given for failure: 
    CSRF token missing or incorrect.

下面是代碼:

 

    from django.shortcuts import render_to_response 
    from djengo.template import RequestContext 
    from django.http import HttpResponse, HttpRequest, HttpResponseRedirect 
    from acmetest.models import Player 
    from acmetest.models import PickForm 

    csrfContext = RequestContext(request) 
    return render_to_response('makepick.html', csrfContext) 

    def playerAdd(request, id=None): 
     form = PickForm(request.POST or None, 
          instance=id and Player.objects.get(id=id)) 

     # Save new/edited pick 
     if request.method == 'POST' and form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/draft/') 

     return render_to_response('makepick.html', {'form':form}) 

再次,

謝謝你的幫助!

dpbklyn

+0

剛看到這個插件-問題。不知道如何/爲什麼答案有幫助,但有一件事我不得不提 - 假設你精確地剪切/粘貼代碼,將django.template拼寫爲'djengo.template'。它不是*無效*代碼,只是輸入錯誤。 (如果你不是,你應該使用RequestContext)。 –

回答

0

更新您的代碼改爲:

from django.shortcuts import render 
# from djengo.template import RequestContext <- this is not valid. 

這兩條線,因爲虞姬指出的,是無效的蟒蛇,此外,他們是沒有必要的,如果你使用render快捷。

# csrfContext = RequestContext(request) 
# return render_to_response('makepick.html', csrfContext) 

修改您的回油管路:

# return render_to_response('makepick.html', {'form':form}) 
    return render(request,'makepick.html',{'form':form}) 
+0

謝謝!雖然我不確定我是否清楚......但我認爲csrf是安全目的所必需的。此外,在HTML模板上的

塊中,我假設我不需要<%csfr_token%>我正確嗎? – dpbklyn

+0

如果您使用提交給視圖的表單(除非您明確將視圖標記爲[豁免自csrf](http://django.me/csrf_exempt)),那麼您總是需要'{%csrf_token%}') 。 ['render'](http://django.me/render)快捷方式爲您處理'RequestContext'需求。 –

0

我假設我們正在談論的playerAdd視圖 - 你需要傳遞RequestContext那裏的響應。

def playerAdd(request, id=None): 
    form = PickForm(request.POST or None, 
         instance=id and Player.objects.get(id=id)) 
    # Save new/edited pick 
    if request.method == 'POST' and form.is_valid(): 
     form.save() 
     return HttpResponseRedirect('/draft/') 

    return render_to_response('makepick.html', RequestContext(request, {'form':form})) 

代碼中的第一行很難理解,甚至不是有效的python。您不能使用功能塊外部的return

+0

'dict'不應該在RequestContext之外,render_to_response應該是render_to_response('makepick.html',{'form':form},RequestContext(request))' –

+0

@SandipAgarwal它是一個'Context '子類,所以它的工作..你更喜歡哪個?我認爲通過RC作爲上下文字典更直觀 –

+0

好的。哪一種更有效率? –