CSRF令牌跟进

5 投票
2 回答
687 浏览
提问于 2025-04-17 11:06

你好,感谢你的帮助。这是一个跟之前讨论相关的问题(我不确定我该在那儿发帖还是重新开个新帖……):

即使我有{% csrf_token %},也出现CSRF令牌缺失或不正确的错误

我不太清楚该如何处理代码才能让csrfContext正常工作。我正在尝试使用ModelForm来收集数据并将其写入MYSQL表格。可是我遇到了这个错误:

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

2 个回答

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

2

把你的代码更新成这样:

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

正如Yuji所指出的,这两行代码在Python中是不合法的,而且如果你使用了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})

撰写回答