2017-01-04 4 views
1

Ich bin mit Ajax Daten speichern in der Datenbank zu einer Ansicht zu übergeben. In Javascript sehen die Daten korrekt aus, aber in der Ansicht ist null. Lesen Sie die Kommentare in Code für weitere Fragen und InformationenAjax überträgt keine Daten

Mein javascript:

... 
var changed_element=[]; 
var changed_value=[]; 

document.getElementById('tabella').addEventListener('change', function(event){ 
    ... 
    changed_element.push(element); //list of list of string 
    changed_value.push(elem[elem.value].text); //list of string 
    ... 
}); 

document.getElementById('btn-save').addEventListener('click', function() { 
    console.log('changed_element', changed_element) //print the right value 
    $.ajax({type: 'POST', 
    url: '/salva-conoscenze-rapporti/', 
    data: { 
     changed_element: changed_element, 
     changed_value: changed_value //<= comma? 
    }, 
    success: function(msg) { 
     console.log(msg) //prints 'It works' 
     document.getElementById('btn-save').style.display = 'none'; 
    } //<= comma? 
    }); 
}); 

Mein view:

@staff_member_required 
@ensure_csrf_cookie #I need this? 
def salva_conoscenze_rapporti(request): 
    if request.is_ajax(): 
     changed_element = request.POST.get('changed_element', None) 
     changed_value = request.POST.get('changed_value', None) 
     msg='it works' 
     print(changed_element) #prints None instead of array 
     print(changed_value) 

    else: 
     msg="it doesn't work" 
    return HttpResponse(msg) 

Mein template base.html:

... 
<script> 
    var csrftoken = $.cookie('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); 
     } 
    } 
    }); 
</script> 
... 

Mein template:

{% extends 'base.html' %} 
... 

Grundsätzlich print(changed_element) sollten die Daten gibt gibt stattdessen None.

Mein MIDDLEWARE_CLASSES in settings.py:

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

Meine Variablen:

changed_element=[ [ "conoscenza", "Cliente1", "Cliente2" ] ]; 

changed_value=[ "Generale" ]; 

console.log(changed_element) gibt: Array [ Array[3] ]

+2

gut kann dies nicht Ihr richtiger Code sein, weil es eine eklatante Syntax eerror ist. Wenn Sie Ihren echten Code veröffentlichen, finden Sie vielleicht eine Lösung – e4c5

+0

Sorry, es ist nur vereinfacht ... Ah, vielleicht sagst du die msg ... Ich übersetze das – fabio

+0

Vielleicht der Umfang der Variablen in Javascript? oder etwas in der CSRF? – fabio

Antwort

0

das Cookie erhalten Sie auch mit jQuery

function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) === (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 
verwenden können

Und dann werde ich das Skript zu korrigieren.

// $('.btn-save').click(function() { // to simply with jquery 
document.getElementById('btn-save').addEventListener('click', function() { 
    $.ajax({ 
    type: 'POST', 
    url: '/salva-conoscenze-rapporti/', 
    data: { 
     "changed_element" : changed_element, 
     "changed_value"  : changed_value, 
     "csrfmiddlewaretoken": csrftoken // from `var csrftoken;` 
    }, 
    success: function(msg) { 
     console.log(msg) //prints 'It works' 
     document.getElementById('btn-save').style.display = 'none'; 
    } //<= comma? 
    }); 
}); 

Oder wie diese:

$('.btn-save').click(function() { 
    var form = new FormData(); 
    form.append('changed_element', changed_element); 
    form.append('changed_value', changed_value); 
    form.append('csrfmiddlewaretoken', getCookie('csrftoken')); 

    $.ajax({ 
    type: 'POST', 
    url: '/salva-conoscenze-rapporti/', 
    data: form, 
    processData: false, 
    contentType: false, 
    success: function(msg) { 
     console.log(msg) //prints 'It works' 
     document.getElementById('btn-save').style.display = 'none'; 
    } 
    }); 
}); 

In Ihrem views.py

from django.views.decorators.csrf import csrf_protect 

@csrf_protect 
@staff_member_required 
def salva_conoscenze_rapporti(request): 
    if request.method == 'POST' and request.is_ajax(): 
     changed_element = request.POST.get('changed_element', None) 
     changed_value = request.POST.get('changed_value', None) 
     msg = 'it works' 
     print(changed_element) 
     print(changed_value) 
    else: 
     msg="it doesn't work" 
    return HttpResponse(msg) 

Hoffe, dass es helfen kann.

+0

Sie hätten meinen Upvote, wenn diese Frage über 403 verbotenen Fehler oft mit CSRF gesehen wurde. Leider beklagt sich das OP nicht über – e4c5

+0

Sogar mit Ihrer Änderung funktioniert es nicht ... vielleicht etwas über das Format der Variablen? Ich sollte sie irgendwie umwandeln? Ich habe meinen Beitrag mit der MIDDLEWARE und den Variablen – fabio

+1

hembbb bearbeitet ... wenn so, der fokussierte Fehler in Ihrem Wörterbuch von 'Daten'. stellt den 'Schlüssel' her, der in der Zeichenkette enthalten ist.' "changed_element" = changed_element'. –

Verwandte Themen