2016-03-30 21 views
1

Bir ajax gönderim (GET sorgu). Ama benim veritabanımda değişiklik yapar, bu yüzden akıllı insanlar bana {% csfr_token %} ile POST kullanmam gerektiğini söyledi.Django adresindeki POST değerlerini alın

GET sorgusu:

... 
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() 
... 

$(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 yüzden verilere type:"post", ve csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]) eklendi ama bunun yerine if request.GET.get('add'): ve if request.GET.get('add'): kullanımına bilmiyorum. if request.POST.get('add'):'u denedim ama işe yaramıyor. Peki bu if POST değerleriyle nasıl kullanılır?

UPD.

Tamam, ben şimdi ne var ... şablonu:

<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} 

Hata yok, ama işe yaramıyor. success:function() iyi çalışıyor ancak veritabanında hiçbir değişiklik yok. Herhangi bir tavsiye?

Ben de if request.POST('action') == 'add': denedik ama

+0

Sadece Bu değişkenleri yazdırın ve bunu bulmalısınız. –

+0

Not: [docs] (https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax) CSRF belirtecini başlığa nasıl dahil edeceğinizi açıklar. ajax isteği, böylece el ile posta verilerinin içine eklemeniz gerekmiyor – Alasdair

cevap

2

veriler için bir nesne kullanın yardımcı {add: {{ event.id }}} yerine vermedi sizinle request.POST değeri getirmesi gerekir bir dize Sonra "add={{ event.id }}"

olarak kodlayan ya Aşağıdakilerden:

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

zaten url eVENT_ID, yani artık gerçekten yok add={{event.id}} ayarlamanız gerekir. Bu gibi bir şey yapabilirsiniz senin görünümünde Sonra

{'action': 'add'} 

"gibi bir şey yapmak için daha iyi olabilir. Bu request.POST` veya` request.body` `de orada olmalı

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

Teşekkürler, ama şimdi MultiValueDictKayError var, yanlış olan nedir? – worm2d

+0

Bu, değerin quest.POST'. Sorunun görünümünüzde mi yoksa şablonunuzda mı olduğunu söylemek için yeterince bilgi göstermediniz. Güncellenmiş cevabımı görün, javascript'inizi değiştirmek ve yine de biraz görmek isteyebilirsiniz. – Alasdair

+0

Cevabınız için çok teşekkür ederim. Sorumu güncelledim, lütfen yardımcı olabilir misiniz? – worm2d

İlgili konular