2013-01-12 55 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