weixin_33713503 2017-01-04 09:37 采纳率: 0%
浏览 60

为什么Ajax不传输数据?

我使用Ajax将数据传递给视图以保存在数据库中。在javascript中,数据看起来是正确的,但是在视图中是空的。你可以阅读下面代码中的注释,以了解其他问题和信息。

我的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?
  });
});

我的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)

我的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>
...

我的template:

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

基本上,print(Changed_Element)应该给出数据,而不是给出None。我在setings.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',
]

我的变量:

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

changed_value=[ "Generale" ];

console.log(changed_element)给出了Array [ Array[3] ]。

  • 写回答

1条回答 默认 最新

  • 衫裤跑路 2017-01-04 09:55
    关注

    To get the cookie you also can use with 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');
    

    And then, I'll correcting your script.

    // $('.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?
      });
    });
    

    Or like this one:

    $('.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 your 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)
    

    Hope it can help.

    评论

报告相同问题?

悬赏问题

  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题