21

I'm trying to POST a jQuery array of simple numbers to Django, and I really can't make it work. I need a little help on this. I'm getting an Http 500 with the following error:

Internal Server Error: /edit_lists/
Traceback (most recent call last):
  File "/home/jabez/.virtualenvs/hackernews/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in get_response
    response = middleware_method(request, response)
  File "/home/jabez/.virtualenvs/hackernews/local/lib/python2.7/site-packages/django/middleware/common.py", line 106, in process_response
    if response.status_code == 404:
AttributeError: 'list' object has no attribute 'status_code'

Here's my code:

JavaScript

    $('.btn-group').find('#mark_as_done').on('click', function() {
    var tasks = grab_selected();

    $.ajax({
        type: 'POST',
        url: '/edit_lists/',
        data: {'tasks': tasks},
    });
});

function grab_selected() {
    var tasks = [];
    $('input:checked').each(function() {
        tasks.push(this.id);
    });
    return tasks;
}

views.py

def edit_lists(request):
tasks = request.POST.getlist('tasks')
return tasks

urls.py

url(r'^edit_lists/$', 'todo.views.edit_lists', name='edit_lists')

2 Answers 2

47

You can try to use tasks[] instead of tasks as parameter when sending via ajax. Example:

$('.btn-group').find('#mark_as_done').on('click', function() {
    var tasks = grab_selected();

    $.ajax({
        type: 'POST',
        url: '/edit_lists/',
        data: {'tasks[]': tasks},
    });
});

Another thing is you are simply returning return tasks in edit_lists() view, you have return a HttpResponse instance or use shortcut like render:

from django.http import HttpResponse

def edit_lists(request):
    tasks = request.POST.getlist('tasks[]')
    return HttpResponse('Success')

Hope it helps,

Sign up to request clarification or add additional context in comments.

8 Comments

it worked now :). I can't believe the answer was so simple. thank you very much!
How come you are sending tasks[] from ajax and able to retrieve via tasks variable. I tried in one of my example. I am getting empty list in django view. If I use request.POST.getlist('tasks[]') and if list in ajax is ['1','2'] then I am getting [u'1',u'2'] in django view.
@Pawan hmm pretty sure I tested when I gave the answer 1.5 years ago, maybe things were different back then. I will update my answer then, cheers!
Even if you send list by variable named tasks , then jQuery POST's arrays with the [] suffix because PHP and some web frameworks understand that convention, and re-build the array on the server-side for you automatically. Django doesn't work that way , but we can access the data via tasks[]
@nidHi it should be selected = request.GET.getlist(​‌​‌​'selected[]') (notice the brackets) since it's a method, not a dictionary
|
12

You can try to use JSON.stringify() method instead of tasks as parameter when sending via Ajax.

Here's the array data on my consol

enter image description here

Then send Array data by ajax

$.ajax({
     type: "POST",
     url: "/user/Survey-Design/",
     headers: {
         'Authorization': "Token " + localStorage.access_token
     },
     data: {
         'arr': JSON.stringify(arr)
     },
     success: function(result) {
         alert('Data Has been saved')
     }
 });

In views.py:

 def create(self,request):
     array_data = request.POST['arr']
     data = json.loads(array_data)
     print(data)
     return HttpResponse('Success')

Finally, show print(data) on terminal

enter image description here

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.