2013-01-12 23 views
0

为什么在{%csrf_token%}的存在下我得到的是以下错误?Django失败时的CSRF

禁止(403) CSRF验证失败。请求中止。

这是我使用的一个示例视图,这么久。

view.py

def editModel(self,request, offset): 
     if 'user' in request.session : 
      user = request.session['user'] 
      if request.method == 'POST': 
       if 'editModel' in request.POST: 
        offset = int(offset) 
        fields = ProfilModel.objects.filter(name=user) 
        workingModelsFiles = WorkingWithModelsFiles() 
        listModel = workingModelsFiles.getCurrentModel(user, offset) 
        modelView = self.listModels(user)[offset-1] 
        loadModels = "document.getElementById('x3dElement" + str(offset) + "').runtime.showAll();" 
        params = {'id ': offset, 
           'userName' : request.session['user'], 
           'surname' : fields[0].surname, 
           'listModel': listModel, 
           'model': modelView, 
           'bodyLoadModels': loadModels 
           } 
        params.update(csrf(request)) 
        return render_to_response('editModel.html', params) 

      else: 
       offset = int(offset) 
       fields = ProfilModel.objects.filter(name=user) 
       workingModelsFiles = WorkingWithModelsFiles() 
       listModel = workingModelsFiles.getCurrentModel(user, offset) 
       modelView = self.listModels(user)[offset-1] 
       loadModels = "document.getElementById('x3dElement" + str(offset) + "').runtime.showAll();" 
       params = {'id ': offset, 
          'userName' : request.session['user'], 
          'surname' : fields[0].surname, 
          'listModel': listModel, 
          'model': modelView, 
          'bodyLoadModels': loadModels 
          } 
       params.update(csrf(request)) 
       return render_to_response('editModel.html', params) 
     else: 
      return HttpResponseRedirect("/login/") 

它存在于模板{%csrf_token%}再次给我一个错误的CSRF

template.html

...... 
<div class="tab_container"> 
      <div id="tab1" class="tab_content"> 
       <table class="tablesorter" cellspacing="0"> 
       <tbody> 
       <form action="{% url 'edit_model' listModel.0.id_model %}" method="post" > 
       {% csrf_token %} 
        {% for item in listModel %} 
         <tr> 
          <td rowspan="3" style="width: 300px;"> {{ model | safe }} </td> 
          <td> Name Model: <i><input class="text_field" type="text" id='id_Model' name="Model" value="{{ item.modelName }}" /> </i> </td> 
         </tr> 

         <tr> 
          <td> Author: <i> <input class="text_field" type="text" id='id_Author' name="Author" value="{{ item.author }}" /> </i> </td> 
         </tr> 
         <tr> 
          <td> <input type="submit" name="editModel" value="Edit" /> </td> 
         </tr> 
        {% endfor %} 
       </form> 
       </tbody> 
       </table> 
      </div><!-- end of #tab1 --> 
....... 

settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 
+0

请确保'MIDDLEWARE_CLASSES contains'' 'django.middleware.csrf.CsrfViewMiddleware','在你的settings.py – Crazyshezy

+0

您是否尝试过使用'和'RequestContext' render_to_response'做,而不是csrf_token处理用'params.update(csrf(request))'手动执行它? – zaphod

回答

0

您是否尝试过使用RequestContext而不是params.update(csrf(request))? 像:

params = {'id ': offset, 
      'userName' : request.session['user'], 
      'surname' : fields[0].surname, 
      'listModel': listModel, 
      'model': modelView, 
      'bodyLoadModels': loadModels 
      } 
ctx = RequestContext(request, params) 
return render_to_response('editModel.html', context_instance=ctx) 
+0

再次出现同样的错误。有趣的是,在html-a之后。

之间的标记 – Krasimir

+0

之后没有任何东西,我认为你是以错误的方式显示gthe表单。 应该是这样的: <形式行动= “{%URL 'edit_model' listModel.0.id_model%}” 方法= “POST”> {%csrf_token%} {{form.as_p}} <输入型=“submit”value =“Submit”/> – nimiq

+0

看看这里:https://docs.djangoproject.com/zh/dev/topics/forms/?from=olddocs#displaying-a-form-using- a-template – nimiq