2011-07-05 31 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}) 
)) 

或:

​​