我认为这与其他问题不同,我已经检查了答案,但仍然没有运气。谢谢你的帮助:
我有一个新闻项目列表(比如Facebook提要),并且每个都附有一个评论表单(使用django.contrib.comments应用程序)。它通常工作正常。
但是,我在页面上使用了一种AJAX'无限滚动' - 滚动时,它会通过AJAX加载下一组新闻项目和相关评论表单。新加载的新闻项目上的评论表单不起作用(CSRF验证失败)。
很明显为什么 - {%csrf_token%}未传递给返回的JSON响应,因此新加载的注释表单没有CSRF数据。
我尝试在Django页面上使用set 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 :(得分:0)
一个选项是通过您返回的JSON响应向表单提供CSRF令牌。我相信您可以通过调用django.middleware.csrf.get_token(request)
以编程方式获取CSRF令牌,然后在您的ajax响应中包含该值。
我能想到的另一个选择是禁用该视图的CSRF保护。
答案 1 :(得分: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})
))
或:
''' from django.core.context_processors import csrf '''
vars = {}
vars.update(csrf(request))
vars.update({'object':object})
objects_list.append(render_to_string('list/snippets/feed_li.html', vars))