Django не получает данные от ajax - PullRequest
0 голосов
/ 17 апреля 2020

Я пытался работать и понимать ajax, не полагаясь на jquery в учебных целях.

Я отправляю данные, полученные из текстового поля.

Вот мой ajax

document.addEventListener('DOMContentLoaded', function() {

   document.getElementById('id_tags').onkeyup = () => {

       // initialize new request
       const request = new XMLHttpRequest();
       request.open("POST", "{% url 'tag_suggestions' %}");

       var keyword = document.getElementById('id_tags').value;
       data = {"keyword": keyword};

       //when request is finished
       request.onload = () => {
            console.log("Test");
         }


       //send request
       request.setRequestHeader("X-CSRFToken", '{{csrf_token}}');
       request.send(JSON.stringify(data));

   };

});

Вот функция django, которая прослушивает мои ajax запросы

def tag_suggestions(request):
    print('inside tag_suggestions ')
    if request.method == 'POST':
        print(request.POST.keys())
        return ('Test')

    else:
        print('not ajax Test')
        return HttpResponse('Test')

Я проверил свой javascript код это просто отлично. Он слушает события, получил значение правильно.

Но в моем django, когда он выполняет request.POST.keys(), вывод будет

dict_keys([])

, и я пришел к выводу, что я не получаю данные из моего ajax запроса ,

Ответы [ 3 ]

1 голос
/ 17 апреля 2020

Как уже упоминалось, вы можете получить доступ к своим данным POST следующим образом:

data = json.loads(request.body)

Я думаю, вам также нужно установить заголовок Content-Type в вашем JS Ajax хотя работать:

request.setRequestHeader("Content-Type", 'application/json;');

PS Похоже на комментарий, но я пока не могу комментировать.

0 голосов
/ 17 апреля 2020

Данные вашего поста как Json должны быть загружены моделью json.

def tag_suggestions(request):
    print('inside tag_suggestions ')
    if request.method == 'POST':
        data = json.loads(request.body)
        print(data)
        return ('Test')

    else:
        print('not ajax Test')
        return HttpResponse('Test')
0 голосов
/ 17 апреля 2020

Вам нужно инициировать ajax вызов

$.ajax({
  url: 'your url',
  method: 'POST',
  data: {"keyword": keyword},
  success: function(response) {
      # response is the data what is returned from the view, in
      # your case, from tag_suggestions
  }
});

И на django стороне вам необходимо вернуть json_response, а не httpResponse

И, конечно, проверьте, если запрос ajax. Не помню правильный синтаксис, но что-то вроде

if request.is_ajax

Возможно, вам потребуется дополнительная проверка на основе типа запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...