【问题标题】:Ajax don't transmit dataAjax 不传输数据
【发布时间】:2017-05-18 13:09:28
【问题描述】:

我正在使用 ajax 将数据传递给视图以保存在数据库中。 在 javascript 中,数据看起来正确,但在视图中为空。 阅读代码中的 cmets 了解其他问题和信息

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

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

【问题讨论】:

  • 这不可能是您的真实代码,因为存在明显的语法错误。如果您发布真实代码,您可能会找到解决方案
  • 对不起,只是简化了……啊,也许你说的是味精……我翻译一下
  • 可能是javascript中变量的作用域?还是csrf中的东西?

标签: ajax django csrf-protection


【解决方案1】:

要获取 cookie,您也可以使用 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');

然后,我会更正你的脚本。

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

或者像这个:

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

在你的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)

希望对你有帮助。

【讨论】:

  • 如果这个问题是关于 CSRF 中常见的 403 禁止错误,你会得到我的支持。不幸的是,这不是 OP 所抱怨的
  • 即使您进行了更改,它也不起作用...也许与变量格式有关?我应该以某种方式转换它们吗?我用 MIDDLEWARE 和变量编辑了我的帖子
  • hembbb... 如果是这样,您的字典中的焦点错误为 data。确保 key 包含在字符串中.. "changed_element" = changed_element.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 2021-10-28
  • 1970-01-01
  • 2013-01-30
  • 2023-03-23
相关资源
最近更新 更多