Ajax вызов, чтобы получить список объектов, на которые кликнули - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь использовать вызов AJAX для отправки данных в мое django представление, которое я затем надеюсь использовать в другом представлении. Когда пользователь нажимает на определенное слово, known_words должно go вверх на одно (эта часть работает). Но я также хочу знать, на какое слово нажал пользователь (у меня есть доступ к нему в шаблоне: {{item.0}}. И это та часть, которую я не могу заставить работать.

Соответствующая часть моего html (это последний столбец моей таблицы, первый столбец содержит {{item.0}}):

<a href="javascript:" class="word_known btn btn-warning btn-sm" data-word="{{item.0}}" data-songpk="{{song_pk}}" data-userpk="{{user_pk}}">Yes</a>

My js:

$(document).ready(function() {
  var known_words = 0;
  var clicked_words = [];
  $(".word_known").click(function() {
    known_words++;
    var reference = this;
    var songpk = $(this).data('songpk');
    var userpk = $(this).data('userpk');
    var clicked_words = $(this).data('clicked_words');  //I know this part is wrong, how can I append the word to the list?
    $.ajax({
      url: "/videos/songs/vocab/known/"+songpk+"/"+userpk+"/",
      data: {known_words: known_words, clicked_words: clicked_words},
      success: function(result) {
    $(reference).removeClass("btn-warning");
    $(reference).addClass("btn-success");
    $(reference).text("Known");
  },
      failure: function(data) {
        alert("There is an error!")
      }
      })

});
})

Просмотры:

def word_known(request, pk_song, pk_user):
    if request.method =='POST':
        pass
    elif request.method == 'GET':
        known_words = request.GET.get('known_words', '')
        clicked_words = request.GET.get('clicked_words', '')
        request.session['known_words'] = known_words
        clicked_words = []
        clicked_words.append(request.session['clicked_words'])
        print('The number of known words is {} and clicked words are {}'.format(known_words, clicked_words))

    return HttpResponse(json.dumps(known_words))

В консоли, когда я нажимаю на слово (не «привет»), я получаю в консоли следующее:
The number of known words is 1 and clicked words are ['hello']

И если я второй раз нажимаю на другое слово:
The number of known words is 2 and clicked words are ['hello']

Значит счетчик работает, а список слов нет. Как исправить это?

Ответы [ 2 ]

1 голос
/ 11 июля 2020

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

Эта строка

var clicked_words = $(this).data('clicked_words');

Должно быть

clicked_words.push($(this).data('clicked_words'));

Это ссылка на документацию по MDN

0 голосов
/ 12 июля 2020

В дополнение к ответу @Daniel Butler мне пришлось изменить свое мнение следующим образом:

clicked_words = request.GET.getlist('clicked_words[]')

Потому что, по-видимому, когда вы отправляете список через jQuery, он также меняет ключевое слово.

...