2011-07-05 39 views
0

これは他の問題とは違うと思いますが、私は答えをチェックしましたが、まだ運がありません。助けてくれてありがとう:Djangoのコメント - AjaxとCSRFの失敗

私はニュースアイテムのリスト(facebookフィードのようなもの)があり、それぞれに(django.contrib.commentsアプリを使って)コメントフォームが添付されています。それは正常に正常に動作します。

しかし、私はAJAXの「無限のスクロール」をページ上に使用しています。スクロールすると、AJAXを介して次のニュース項目と関連コメントフォームが読み込まれます。新しくロードされたニュース項目のコメントフォームは機能しません(CSRF検証に失敗します)。

戻ってくるJSON応答に{%csrf_token%}が渡されないので、新しく読み込まれたコメントフォームにはCSRFデータがありません。

私はDjangoページ(https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#ajax)でCookie設定メソッドを使用しようとしましたが、動作していないようです。 CSRFを完全に除外するために@csrf_exemptデコレータを試してもいません。

戻ってくるJSONレスポンスとともにcsrf_tokenをどのように渡すことができますか?あるいは代替手段がありますか?ここで

はビューです:

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

1つのオプションは、あなたが戻ってきているJSON応答を介して自分のフォームにCSRFトークンを提供することになるだろう。 django.middleware.csrf.get_token(request)を呼び出し、あなたのajaxレスポンスにその値を含めることで、プログラムでCSRFトークンを取得できると思います。

もう1つの方法は、そのビューの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}) 
)) 

か:

​​ このように、ラインを交換
関連する問題