2016-03-30 17 views
1

私はajax submit(GETクエリ)を送信しました。しかし、それは私のデータベースに変更を加えるので、{% csfr_token %}の代わりにPOSTを使うべきだという賢い人たちに教えてください。DjangoでPOST値を取得

GETクエリ:

$(document).on('submit','#follow', function(e){ 
    var $button = $(this).find('button'); 
    e.preventDefault(); 
    $.ajax({ 
     url:'/event/{{ event.id }}/', 
     data: "add={{ event.id }}", 
     success:function(){ 
      $('#follow').hide(); 
      $('#unfollow').show(); 
     } 
    }) 
}); 

views.py

... 
event = get_object_or_404(Event, id=event_id) 
user = request.user 
    if request.GET.get('add'): 
     event.users.add(user) 
     event.save() 
    if request.GET.get('remove'): 
     event.users.remove(user) 
     event.save() 
... 

だから私は、データへtype:"post",csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken])を追加しましたが、私はif request.GET.get('add'):if request.GET.get('add'):の代わりに使用するのか分かりません。私はif request.POST.get('add'):を試しましたが、動作しません。では、ifをPOST値で使用する方法は?

UPD。

[OK]を、私は今持っているもの... テンプレート:

<form id="unfollow" {% if user not in event.users.all %}style="display:none;"{% endif %}> 
    <input type="hidden" value="{{ event.id }}" name="remove"> 
    <button type="submit" class="btn btn-warning btn-block">{% trans "Unfollow"%}</button> 
</form> 

...

$(document).on('submit','#unfollow', function(e){ 
    var $button = $(this).find('button'); 
    e.preventDefault(); 
    $.ajax({ 
     type:"post", 
     url:'/event/{{ event.id }}/', 
     data: { 
      'action': 'remove' 
     }, 
     success:function(){ 
      $('#unfollow').hide(); 
      $('#follow').show(); 
     } 
    }) 
}); 

views.py:

def show_event(request, event_id): 
    event = get_object_or_404(Event, id=event_id) 
    user = request.user 
    if 'action' in request.POST: 
     if 'action' == 'add': 
      event.users.add(user) 
      event.save() 
     elif 'action' == 'remove': 
      event.users.remove(user) 
      event.save() 
    return render(request, 'events/event.html', {'event':event, 'user':user} 

エラーなし、それは動作しません。 success:function()は正常に動作しますが、データベースに変更はありません。何かアドバイス?

私もif request.POST('action') == 'add':を試してみましたが、それは

+0

をジャストこれらの変数を出力してください。 –

+0

[the docs](https://docs.djangoproject.com/ja/1.9/ref/csrf/#ajax)には、CSRFトークンをヘッダーに含める方法が説明されていますajaxリクエストであるため、手動で投稿データに含める必要はありません – Alasdair

答えて

2

は、データのためのオブジェクトを使用し{add: {{ event.id }}}代わりに文字列"add={{ event.id }}"

としてそれをコードの後、あなたはどちらかとrequest.POSTから値を取得することができるはず助けにはなりませんでした次の:

request.POST['add'] 
request.POST.get('add', 'default') # use default if key doesn't exist 

すでにURLでのevent_idているので、あなたは本当にadd={{event.id}}を設定する必要はありません。それはあなたのような何かを行うことができ、あなたのビューで次に

{'action': 'add'} 

「のような何かをした方がよいかもしれません:それはrequest.POST`または `` request.body`であるはず

if 'action' in request.POST: 
    if request.POST['action'] == 'add': 
     # do something 
    elif request.POST['action'] == 'remove': 
     # do something else 
+0

ありがとうございますが、MultiValueDictKayErrorがあります。何が問題なのですか? – worm2d

+0

これは、値が 'reクエスト。ポスト。問題があなたのビューやテンプレートにあるかどうかを私たちに伝えるのに十分な情報が表示されていません。私の更新された答えを参照してください、あなたはJavaScriptを変更し、とにかく少し見たいかもしれません。 – Alasdair

+0

お返事ありがとうございました。私はあなたの質問を更新しました。 – worm2d

関連する問題