Ajax возвращает пустую строку в представлении Django - PullRequest
1 голос
/ 14 июня 2019

Я разрабатываю веб-приложение через Django и хочу получить информацию из моего javascript для просмотра Django, чтобы получить доступ к базе данных.

Я использую ajax-вызов, так как в этом сообщении показано . Я вызываю js в html по событию onclick:

sortedTracks.html

     ...
    <form action="{% url 'modelReco:sortVideo' video.id %}">
        <input type="submit" value="Validate" onclick="ajaxPost()" />
    </form>
    ...

clickDetection.js

//defined here
var tracksSelected = [];

//function that fill tracksSelected
function tagTrack(track_num){
  if(tracksSelected.includes(track_num)){
    var index = tracksSelected.indexOf(track_num);
    tracksSelected.splice(index, 1);
  }else{
      tracksSelected.push(track_num);
  }};

//ajax function
function ajaxPost(){
$.ajax({
    method: 'POST',
    url: '/modelReco/sortedTracks',
    data: {'tracksSelected': tracksSelected},
    success: function (data) {
         //this gets called when server returns an OK response
         alert("it worked! ");
    },
    error: function (data) {
         alert("it didnt work");
    }
});
};

Таким образом, информация, которую я хочу передать, tracksSelected и представляет собой массив типа int [21,150,80]

views.py

def sortedTracks(request):
if request.is_ajax():
    #do something
    print(request)
    request_data = request.POST
    print(request_data)

    return HttpResponse("OK")

Пост Ajax работает хорошо, но я получаю только пустой запрос Dict, подобный этому:
<QueryDict: {}> И если я распечатаю запрос, я получаю:

<WSGIRequest: GET '/modelReco/sortedTracks/?tracksSelected%5B%5D=25&tracksSelected%5B%5D=27&tracksSelected%5B%5D=29'>

Я также пытался изменить на request_data=request.GET, но получаю странный результат, когда данные теперь находятся в tracksSelected[]

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

По моему мнению, для доступа к данным, которые отправляются в запросе ajax, можно получить прямой доступ.Например:

def sortedTracks(request):
    if request.method == 'POST':
        usersV = request.POST.get('tracksSelected')[0]

            for users in usersV:
                print users
        return HttpResponse("Success")
    else:
        return HttpResponse("Error")

Правильный синтаксис: data: {trackSelected: trackSelected},

0 голосов
/ 14 июня 2019

Я пытался узнать, почему, если я делал request_data=request.GET, я получаю данные вроде tracksSelected[] и получаю только последний элемент.

И я нашел способ избежать использования массива в моих данных (trackSelected) по этой ссылке Это позволяет мне иметь:

в views.py

def sortedTracks(request):
if request.is_ajax():
    #do something
    print(request)
    request_data = request.GET.getlist("tracksSelected")[0].split(",")
    print(request_data)

и в clickDetection.js

function ajaxPost(){
tracksSelected = tracksSelected.join();
$.ajax({
    method: 'POST',
    url: '/modelReco/sortedTracks',
    data: {'tracksSelected': tracksSelected},
    success: function (data) {
         //this gets called when server returns an OK response
         alert("it worked! ");
    },
    error: function (data) {
         alert("it didnt work");
    }
});
};

Этот маленький трюк работает, и я могу получить данные массива вот так, print(request_data) возвращает мой массив, такой как [21,25,27]

Спасибо за помощь!

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