2015-07-08 6 views
0

У меня есть приложение Django, где шаблон содержит для цикла в javascript, который выполняет итерацию всех флажков в некоторой таблице. Для каждого флажка я отправляю запрос ajax функции просмотра, где я хочу сохранить идентификатор этого флажка в списке или удалить идентификатор из списка (зависит от состояния проверки). Мне нужен список, чтобы быть частью словаря request.session. Результаты показывают мне, что вызовы ajax являются асинхронными и что мой список ошибочно обновляется и несовместим. Есть ли какие-то потокобезопасные структуры данных, которые я могу хранить как часть сеанса, и обеспечить обновление списка синхронизации?Обработка асинхронных вызовов ajax в сеансе django

JavaScript и Ajax:

function checkAll(source, type) { 
      checkboxes = document.getElementsByName(type); 
      for(var i=0, n=checkboxes.length;i<n;i++) { 
       if (checkboxes[i].checked != source.checked) { 
        checkboxes[i].checked = source.checked; 
        select_row(checkboxes[i], source.checked); 
       } 
      } 
     } 

function select_row(row_selector, is_checked) { 
      is_box_checked = typeof is_checked !== 'undefined' ? is_checked : row_selector.checked; 
      request = { 
       url: "{% url 'set_check_box' %}", 
       type: "POST", 
       contentType: "application/x-www-form-urlencoded", 
       data: { 
        csrfmiddlewaretoken: "{{ csrf_token }}", 
        checked: is_box_checked, 
        check_box_id: row_selector.id, 
        type: row_selector.name 
       }, 
       error: function(response, status, error_msg) { 
        console.log(error_msg); 
       } 
      }; 
      $.ajax(request); 
     } 

Вид функции:

def set_check_box(request): 
    request.session.modified = True 
    check_box_list = list(request.session['connects_check_boxes_id_list']) 
    check_box_id = request.POST["check_box_id"] 
    is_checked = json.loads(request.POST['checked']) 
    if is_checked: 
     check_box_list.append(check_box_id) 
    else: 
     check_box_list.remove(check_box_id) 
    request.session['connects_check_boxes_id_list'] = list(check_box_list) 
return HttpResponse("") 
+0

Ну, очевидно, существует асинхронная опция для запросов ajax. Я отправлю свое решение, чтобы оно помогло другим – orizis

ответ

0

Все, что я должен был сделать, это установить параметр асинхронной ложь как часть параметров запроса.

function select_row(row_selector, is_checked) { 
      is_box_checked = typeof is_checked !== 'undefined' ? is_checked : row_selector.checked; 
      request = { 
       url: "{% url 'set_check_box' %}", 
       type: "POST", 
       contentType: "application/x-www-form-urlencoded", 
       async: false, 
       data: { 
        csrfmiddlewaretoken: "{{ csrf_token }}", 
        checked: is_box_checked, 
        check_box_id: row_selector.id, 
        type: row_selector.name 
       }, 
       error: function(response, status, error_msg) { 
        console.log(error_msg); 
       } 
      }; 
      $.ajax(request); 
     } 
Смежные вопросы