2016-10-21 3 views
0

У меня есть список флажков в таблице в приложении Django. Пользователь выбирает некоторые из них, а затем нажимает кнопку действия. Затем появляется небольшая всплывающая модальная форма, где они заполняют информацию, связанную с выбранными элементами, и они также могут загружать файл во всплывающем окне. Мне нужно отправить идентификаторы выбранных флажков и поля формы в модальном формате на Django с помощью ajaxОтправка списка флажков через Ajax в Django

Я обернул модальный код в теге формы и все работает хорошо. Я пытаюсь отправить список выбранных идентификаторов в Django. Когда пользователь выбирает id 31 и 32, он отправляет его как «31, 32» в виде строки, а Django не может его декодировать. Я уверен, что это быстрое решение, но мои знания javascript ограничены.

Ниже мой код:

Html:

<tr> 
    <td ><input class="selection-box" type="checkbox" name="action" value="{{ item.id }}"></td> 
    <td>...</td> 
</tr> 
<tr> 
    <td ><input class="selection-box" type="checkbox" name="action" value="{{ item.id }}"></td> 
    <td>...</td> 
</tr> 

Javascript:

submitHandler: function() { 
    var matches = []; 
    $(".selection-box:checked").each(function() { 
     matches.push(this.value); 
    }); 
    var form = document.forms.namedItem("fileinfo");// This is the popup form that contains that file upload box and other fields 
    var oData = new FormData(form); 
    if (matches.length) { 
     oData.append('action', matches); 
    } 
    $.ajax({ 
     url: url, 
     processData: false, 
     contentType: false, 
     type: 'post', 
     data: oData, 
     success: function (data) { 
      if (data.success == true) { 
       location.reload(); 
      } 
     } 
    }); 
} 

Джанго вид:

# This generates the error: ValueError: invalid literal for int() with base 10: '33,31' 
selected_list = self.request.POST.getlist('action') 
+0

print selected_list ?? – Mahi

+0

Я не могу напечатать его, потому что он генерирует ValueError – Johan

+0

http://stackoverflow.com/a/5867262/3762142 помогает ... –

ответ

1

Поскольку вы вручную делать 'декодирование' , вместо нас ING .getlist, вы можете пойти с .get и .split:

selected_list = self.request.POST.get('action', '').split(',') 

но иметь в виду, что возвращаемый list будет содержать ваши ids, как строки, так что вы можете использовать map, чтобы преобразовать их в целые числа.

try: 
    cleaned_list = map(int, selected_list) 
except ValueError: 
    #list is empty: [''] 
    cleaned_list = [] 
+0

Спасибо, я уверен, что это будет делать трюк, но разве нет лучшего способа добиться этого? Другие места в приложении, которые я только что отправил «action = 31 & action = 32», затем request.POST.getlist («action») возвращает ['31', '32'] – Johan

+0

Im не уверен, что он будет работать, но в JS попробуйте вместо 'oData.append ('action', matches);' добавить один элемент за раз: 'matches.forEach (function (match) {oData.append ('action', match)});' – Todor

+0

Да , это сработало! Теперь, единственное, что я не уверен в том, что при использовании запроса в Django, таком как MyModel.objects.filter (pk__in = my_list), «my_list» должен быть целым? – Johan

Смежные вопросы