2012-01-26 160 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

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