CSRF令牌未插入模板

时间:2015-06-21 18:24:01

标签: python django django-csrf

我是Django 1.7使用此代码渲染视图。在这里,我正在渲染一个名为frame.html的html模板并传递上下文。

from django.template import Context
from django.template import Template
from django.shortcuts import render 
from django.http import HttpResponse

def frame(request):
    if request.GET.get('qid'):
        qid = request.GET['qid']
        displayQuestion = questions.objects.filter(questionSetId=qid)[0].Questions
        questionJSON = json.loads(displayQuestion)
        template = Template('frame.html')
        context = Context({'qid':qid,'questionData':questionJSON})
        return render(request,'frame.html',context)
    else:
        return views.products(request)

在我的模板frame.html中有一个表单,我在其中使用{%csrf_token%}标记。这是代码。

<form action="/submit"  method="POST" id="responseform">
      {% csrf_token %}
      <input type="hidden" id="questionID" name="questionID" value="{{qid}}">
      <input type="hidden" id="studentResponse" name="responses" value="">
</form>

我的问题是,尽管使用了csrf_token标记,但我收到错误消息CSRF token missing or incorrect。请检查此错误。感谢

1 个答案:

答案 0 :(得分:1)

为什么使用Context类? render在传递dict时为您构造一个RequestContext,它是您运行上下文处理器(包括插入CSRF令牌的处理器)所需的。只需删除该导入并使用dict:

    context = {'qid':qid,'questionData':questionJSON}
    return render(request,'frame.html',context)

你不需要Template类或你从中得到的变量 - 再次,render为你完成所有这些,而你甚至没有传递{{1}变量在任何地方。