2011-07-05 32 views
0

我認爲這是不同於其他問題,我已經檢查了答案,仍然沒有運氣。感謝您的幫助:Django評論 - Ajax和CSRF失敗

我有一個新聞項目列表(如Facebook的飼料),並有每個附加的評論表(使用django.contrib.comments應用程序)。它正常工作正常。

但是,我在頁面上使用了一種AJAX「無限滾動」 - 當您滾動時,它會通過AJAX加載下一組新聞項目和相關評論表單。新加載的新聞項目的評論表單不起作用(CSRF驗證失敗)。

很明顯,爲什麼 - {%csrf_token%}沒有傳遞給返回的JSON響應,所以新加載的評論表單沒有CSRF數據。

我已經嘗試使用Django頁面上的設置cookie方法(https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#ajax),但似乎不工作,也不會嘗試@csrf_exempt裝飾器來完全排除CSRF。

任何建議如何我可以傳遞一個csrf_token以及返回的JSON響應?還是有其他選擇嗎?

這裏的觀點:

def my_view(request): 
    # the normal view gets a queryset of all Info items and returns them 
    infos = Info.objects.all() 
    .... 

    # here's the AJAX part 
    if request.GET.get('xhr') and page > 1: 
     infos = paginator.page(int(request.GET.get('page'))) 
     objects_list = [] 
     for object in infos: 
      objects_list.append(render_to_string('list/snippets/feed_li.html', { 
       'object': object, 
      })) 

     json = simplejson.dumps(objects_list, cls=DjangoJSONEncoder) 
     return HttpResponse(json, mimetype='application/json') 

回答

0

一種選擇將是通過你正在返回JSON響應提供CSRF令牌的形式。我相信你可以通過調用django.middleware.csrf.get_token(request)編程獲得CSRF令牌,然後在你的ajax響應中包含該值。

我能想到的另一個選擇是禁用該視圖的CSRF保護。

0

首先檢查您是否忘記在「list/snippets/feed_li.html」中包含{%csrf_token%};

其次,要使csrf標記正常工作,必須使用RequestContext或手動生成標記並在呈現模板時將其添加到上下文變量(請參閱Django csrf ref)。因此,替換行:

objects_list.append(render_to_string('list/snippets/feed_li.html', { 
    'object': object, 
})) 

與:

''' from django.template import RequestContext ''' 
objects_list.append(render_to_string('list/snippets/feed_li.html', \ 
    RequestContext(request, {'object':object}) 
)) 

或:

​​