2011-12-30 10 views
6

Mam następujący ajax wezwanie do aktualizacji konkretny pole modeluAjax wywołanie braku w Django

$("#updateLink").click(function(){ 
    var dec_text = $('#desc_text').val(); 

    $.ajax({ 
     type: "POST", 
     url:"https://stackoverflow.com/users/update_desc/", 
     data: { 
     'val': dec_text, 
     }, 
     success: function(){ 
      $(".display, .edit").toggle(); 
      $("#descText").html(dec_text); 
     }, 
     error: function(){ 
      alert("Error"); 
     }, 
    }); 
    return false; 
}); 

i moim zdaniem jest to

@csrf_exempt 
def update_desc(request): 
    if request.is_ajax(): 
     if request.method == 'POST': 
      desc_text = request.POST.get('val', False) 
      if desc_text: 
       profile = user.profile 
       profile.desc = desc_text 
       profile.save() 

      return_message = "Sent mail" 
      return HttpResponse(return_message,mimetype='application/javascript') 

ja ciągle otrzymuję komunikat o błędzie i ja nie wiem jak to rozwiązać. Użyłem nawet dekoratora csrf_exempt do obejścia problemu, jeśli problem został spowodowany przez brakujący csrf token, ale problem nadal występuje.

Z wyjątkiem jednego ajax post, który w moim szablonie base powoduje niepowodzenie wszystkich wywołań ajax. Czy ktokolwiek może pomóc zrozumieć, co się tutaj dzieje. W razie potrzeby mogę podać więcej szczegółów.

Edit:

Dodałem plik js zawierający tę https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax w moim szablonu bazowego, więc oznacza to, że jest on obecny we wszystkich moich szablonów. Używam wersji 1.3 django.

+0

Spodziewam się, że nadal otrzymujesz błąd csrf_token missing. Jeśli tak, moja odpowiedź jest zamieszczona poniżej, należy podać błąd po użyciu csrf_exempt. –

+0

Właściwie to nie wiem, jak uzyskać błąd, ponieważ widzisz, że właśnie wprowadziłem alert w moim wywołaniu "błędu", które mówi mi, że moje wywołanie ajaxowe nie powiodło się, ale nie mówi mi, jaki był błąd. Jak mogę uzyskać błąd? – Sachin

+0

Po pierwsze, w pliku settings.py DEBUG = True. Nie wyświetliłoby to twoich błędów ajaxowych, ale zdecydowanie innych, które nie są zaspokajane. –

Odpowiedz

6

Po pierwsze, używasz testu POST i nie wysyłasz numeru tokena . Spróbuj jawnie wysłać token csrf zamiast używać dekoratora csrf_exempt.
Jednym ze sposobów na to jest to, co zrobiłem w danych. Oznacza to pobranie tokena csrf (lub z własnej metody) i przekazanie go w swoich argumentach.

$.ajax({ 
     url : url, 
     type: "POST", 
     data : {csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value}, 
     dataType : "json", 
     success: function(data){ 
      // do something 
     } 
    }); 
+0

Teraz nic się nie dzieje, widzę tylko # na końcu adresu URL oznacza to, że 'return false' nie został wykonany w procedurze obsługi zdarzenia – Sachin

+0

Wykonaj kroki wymienione w komentarzach powyżej. –

Powiązane problemy