Ajax: отправить массив целых чисел в Django - PullRequest
3 голосов
/ 25 октября 2011

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

Код Ajax:

    /* Add a click handler for the delete row */
    $('#delete').click( function() {
        /* fnGetSelected returns an array of integers - each int is a db unique id */
        var anSelected = fnGetSelected( oTable );
        delete_url = '/delete/' + anSelected[0];               
        $.ajax({                  
              url: delete_url,
              type: 'GET',
          });
        oTable.fnDeleteRow( anSelected[0] ); 
        fnReloadAjax();
    } );

Код Джанго:

@login_required
def delete(request, row_id):                          
     item = get_object_or_404(Items, pk=row_id, user=request.user)
     item.delete()

Как я могу обновить это, чтобы передать все идентификаторы строк на серверную часть Django? Я думаю, мне нужно POST массив anSelected, но я не уверен, как это сделать. Какой код Django мне понадобится для обработки этого целочисленного массива?

Ответы [ 2 ]

6 голосов
/ 25 октября 2011

Вы можете попробовать что-то вроде этого:

$(function(){
    $.post("{% url delete %}", {"ids[]": anSelected}, function(res){
    if(res.ok){
        // remove rows from your table, maybe :)
        // oTable.fnDeleteRow(anSelected);
      }else{
        alert(res.errors); 
      } 
    });
})

На сервере:

@ajax_request
def test(request):
    ids = request.POST.getlist("ids[]")
    try:
        Items.objects.filter(id__in=ids).delete()
    except:
        return {"ok": False, "errors": "your error"}
    return {"ok": True}

декораторы @ajax_request от https://bitbucket.org/offline/django-annoying/wiki/Home и позволяют возвращать ответ json.

2 голосов
/ 25 октября 2011

Вам нужно будет использовать simplejson.loads, например, если вы передадите массив anSelected как arr, вы будете использовать что-то вроде этого

from django.utils import simplejson

array = simplejson.loads(request.POST['arr'])
try:
    ModelName.objects.filter(pk__in=array).delete()
except:
    return HttpResponse(simplejson.dumps({'ok': False}))
return HttpResponse(simplejson.dumps({'ok': True}))

, а в вашем JavaScript это будетэти строки:

$.post(
    '/delete/',
    {arr: anSelected},
    function(data){
        if(data.ok){
            //Everything went smoothly
        }else{
            //Something failed, you can send extra info from django like the name of the exception thrown if you'd want and display it
        }
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...