2016-10-14 4 views
0

私はFAQアプリケーションを作成しています。私の記事の詳細ページで、私は投票システムを実装しようとしています。目標は、ユーザーが有用であると判断した場合に記事の投票を許可することです。ユーザーが投票ボタンをクリックしたときにページを更新する必要はありません。私は、UpdateViewへのURLに沿ってテンプレートからAjax呼び出しを使用することを選択しました。Django:csrfトークンをajaxに渡してUpdateView 405メソッドにエラーが見つかりません

Djangoには、渡されるcsrfトークンが必要です。私が遭遇している問題は405 (Method Not Allowed)エラーです。 chrome devのネットワーク設定で、csrfトークンが生成され、httpヘッダーに割り当てられていることを確認しました。私はこの問題が見えるかもしれないと思っていますが、これまでに試したことはすべて不足しています。どんな方向にも役立ちます。

EDITのUPDATE:

私はDjangoの1.10

URLを使用しています:

from django.conf.urls import url 
from faq.views import * 

urlpatterns = [ 
    url(r'^ironfaq/$', DashboardView.as_view()), 
    url(r'^ironfaq/(?P<slug>[\w-]+)/$', SectionView.as_view()), 
    url(r'^ironfaq/(?P<topic_slug>[\w-]+)/(?P<section_slug>[\w-]+)/(?P<pk>\d+)/$', 
     ArticleDetailView.as_view(), name="faq-article-detail"), 
    url(r'^ironfaq/topic/create/$', TopicCreateView.as_view()), 
    url(r'^ironfaq/section/create/$', SectionCreateView.as_view()), 
    url(r'^ironfaq/(?P<topic_pk>\d+)/article/create/$', ArticleCreateView.as_view()), 
    url(r'^ironfaq/topic/update/(?P<pk>\d+)/$', TopicUpdateView.as_view()), 
    url(r'^ironfaq/section/update/(?P<pk>\d+)/$', SectionUpdateView.as_view()), 
    url(r'^ironfaq/article/update/(?P<pk>\d+)/$', ArticleUpdateView.as_view()), 
    url(r'^ironfaq/topic/delete/(?P<pk>\d+)/$', TopicDeleteView.as_view()), 
    url(r'^ironfaq/section/delete/(?P<pk>\d+)/$', SectionDeleteView.as_view()), 
    url(r'^ironfaq/article/delete/(?P<pk>\d+)/$', ArticleDeleteView.as_view()), 
    url(r'^ironfaq/article/vote/(?P<pk>\d+)$/', ArticleVoteView.as_view()), 
] 

テンプレート・スクリプト:

{% block scripts %} 
<script> 
$(document).ready(function(){ 
    var csrftoken = Cookies.get('csrftoken'); 

    function csrfSafeMethod(method) { 
     // these HTTP methods do not require CSRF protection 
     return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
    } 
    $.ajaxSetup({ 
     beforeSend: function(xhr, settings) { 
      if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
       xhr.setRequestHeader("X-CSRFToken", csrftoken); 
      } 
     } 
    }); 


    function post_call(vote_data){ 
     var data = {vote_type: vote_data}; 
     var id = {{ object.id }}; 
     $.ajax({ 
      url: "/ironfaq/article/vote/"+id+"/", 
      type: "POST", 
      data: data, 
     }).done(function() { 
      console.log("POST!"); 
     }); 
    } 

    var vote_up = "vote_up"; 
    var vote_down = "vote_down"; 

    var thumbs_up = $('#thumbs_up'); 
    var thumbs_down = $('#thumbs_down'); 

    thumbs_up.on('click', function(){ 
     post_call(vote_up) 
    }); 
    thumbs_down.on('click', function(){ 
     post_call(vote_down) 
    }); 
}); 
</script> 
{% endblock %} 

ビュー:

class ArticleVoteView(UpdateView): 
    model = Article 
    fields = [] 

    def form_valid(self, form): 
     article = form.save(commit=False) 
     vote_type = self.request.POST.get('vote_type') 

     if vote_type == 'vote_up': 
      article.vote_up = article.vote_up + 1 
      article.save() 
     elif vote_down == 'vote_down': 
      article.vote_down = article.vote_down + 1 
      article.save() 

     data = {'status': 'success', 'vote_type': vote_type, 'yes_count': article.vote_up, 
       'total_votes': article.total_votes()} 

     return HttpResponse(json.dumps(data)) 
+0

Djangoは後ろにスラッシュのないURLが好きではありません。リダイレクトが発生する可能性があります。それが助けにならない場合は、いつもビューの 'dispatch'メソッドをオーバーロードして、どのようなリクエストが構築されているかを知ることができます。そのメソッドでは' pdb'を使います。 – McAbra

+0

そのビューでURLが処理されていますか?あなたのURLパターンを示してください。 – Alasdair

+0

すべてのURLを表示するように編集しました。 –

答えて

0

/ironfaq/article/vote/<id>にあなたのポストの要求は、このURLパターンにマッチしているように見えます:

url(r'^ironfaq/(?P<topic_slug>[\w-]+)/(?P<section_slug>[\w-]+)/(?P<pk>\d+)/$', 
    ArticleDetailView.as_view(), name="faq-article-detail"), 

詳細ビューのみが要求を取得扱うので、あなたのポストの要求は405応答を引き起こし。

URLパターンが衝突しないようにデザインを変更するか、faq-article-detail URLパターンをvote urlパターン(およびそれと衝突するその他のパタ​​ーン)の下に移動する必要があります。