Doorgeven van zoeklijst naar django-weergave via jQuery ajax-oproep

Ik probeer een lijst met numerieke waarden (id's) over te dragen van de ene webpagina naar de andere met jQuery ajax-aanroep. Ik kan niet achterhalen hoe alle waarden in de lijst moeten worden doorgegeven en gelezen. Ik kan met succes 1 waarde maar niet meerdere waarden plaatsen en lezen. Dit is wat ik tot nu toe heb:

jQuery:

var postUrl = "http://localhost:8000/ingredients/";
$('li').click(function(){
    values = [1, 2];
    $.ajax({
        url: postUrl,
        type: 'POST',
        data: {'terid': values},
        traditional: true,
        dataType: 'html',
        success: function(result){
            $('#ingredients').append(result);
            }
    });       
});

/ingrediënten/weergave:

def ingredients(request):
    if request.is_ajax():
        ourid = request.POST.get('terid', False)
        ingredients = Ingredience.objects.filter(food__id__in=ourid)
        t = get_template('ingredients.html')
        html = t.render(Context({'ingredients': ingredients,}))
        return HttpResponse(html)
    else:
        html = '

This is not ajax

' return HttpResponse(html)

With Firebug I can see that POST contains both ids but probably in the wrong format (terid=1&terid=2). So my ingredients view picks up only terid=2. What am I doing wrong?

EDIT: To clarify, I need the ourid variable pass values [1, 2] to the filter in the ingredients view.

10

5 antwoord

U kunt deze array openen door request.POST.getlist ('terid []') in de weergave

in javascript:

$.post(postUrl, {terid: values}, function(response){
    alert(response);
});

in view.py:

request.POST.getlist('terid[]')

Het werkt perfect voor mij.

30
toegevoegd
+1 voor KISS over KISS Solution.
toegevoegd de auteur doniyor, de bron
+1 very KISS-oplossing
toegevoegd de auteur andilabs, de bron
selected = request.GET.getlist ['selected []'] TypeError: 'instancemethod' object heeft geen attribuut '__getitem__' Ik krijg deze foutmelding ... Maar ik heb een array van steken zoals ["one", "two", "three"] en gebruik een GET -verzoek ...
toegevoegd de auteur nidHi, de bron

Ik vond een oplossing voor mijn oorspronkelijke probleem. Het hier plaatsen als een antwoord, hopelijk helpt het iemand.

jQuery:

var postUrl = "http://localhost:8000/ingredients/";
$('li').click(function(){
    values = [1, 2];
    var jsonText = JSON.stringify(values);
    $.ajax({
        url: postUrl,
        type: 'POST',
        data: jsonText,
        traditional: true,
        dataType: 'html',
        success: function(result){
            $('#ingredients').append(result);
            }
    });       
});

/ingrediënten/weergave:

def ingredients(request):
    if request.is_ajax():
        ourid = json.loads(request.raw_post_data)
        ingredients = Ingredience.objects.filter(food__id__in=ourid)
        t = get_template('ingredients.html')
        html = t.render(Context({'ingredients': ingredients,}))
        return HttpResponse(html)
    else:
        html = '

This is not ajax

' return HttpResponse(html)
3
toegevoegd
Gewoon een FYI - sommige oudere browsers hebben geen JSON-bibliotheek ingebouwd. U kan beter af zijn met $. Serialize in plaats van JSON.stringify
toegevoegd de auteur Josh Smeaton, de bron

Dit deel is uw probleem:

ourid = request.POST.get('terid', False)
ingredients = Ingredience.objects.filter(food__id__in=ourid)

U moet de JSON-reeks deserialiseren.

import json
ourid = json.loads(request.POST.get('terid'))
2
toegevoegd
Dit loste mijn probleem op, les geleerd.
toegevoegd de auteur almost a beginner, de bron
Wanneer ik dat doe, krijg ik deze foutmelding in de ajax-callback: TypeError at/ingredients/'int'-object is niet iterabel
toegevoegd de auteur finspin, de bron

Het lijkt erop dat je de array hier instelt om te rijgen

data: {'terid': values},

Het zou moeten zijn

data: {terid: values}
1
toegevoegd
Nog steeds wordt alleen de tweede waarde opgehaald (terid = 2).
toegevoegd de auteur finspin, de bron

Probeer gegevens als deze te verzenden:

   data: values;
0
toegevoegd