2016-07-15 3 views
2

Я пытаюсь передать массив Javascript в мои представления Django. Это работает, но я хотел бы манипулировать этими данными и отображать их в отдельном URL-адресе. Поэтому у меня есть страница продуктов, на которой вы выбираете элементы. Когда форма отправлена, этот браузер называюсь, и я хочу, чтобы перенаправить на страницу корзины:Перенаправление на новую страницу после получения данных из Javascript

$("#getArr").submit(function(){ 
    var data = {'ab[]' : chosen}; 
    $.post('cart/', data, function(response){ 
    if(response == 'success'){ 
     window.location.href="cart/" // references my views 
    } 
    else{ 
     alert('Error! :('); 
    } 
    }); 
}); 

views.py

def cart(request): 
    if request.method == 'POST': 
    chosen = request.POST.getlist('ab[]') 
    print(chosen, file=sys.stderr) 
    template = loader.get_template('o/cart.html') 
    context = {'prodChosen': chosen, 
       'e': "hy"} 
    return HttpResponse('success') 
    # return HttpResponse(template.render(context, request)) 
else: 
    template = loader.get_template('o/cart.html') 
    context = {} 
    return HttpRepsonse('fail') 
    # return HttpResponse(template.render(context, request)) 

Как и в закомментированном HTTPResponse линии, я необходимо передать данные в мой cart.html (это будут объекты из одной из моих моделей). Я не знаю, как передавать данные на мою страницу.

Линия print(chosen, file=sys.stderr) была весьма полезна. Раньше, когда у меня был код, который использовал прокомментированные строки HttpResponse, он печатал на моем терминале как нужный массив, так и пустой. Однако с этим новым кодом искомый массив распечатывается, но он не перенаправляется на новую страницу. Я не уверен, почему это происходит, но я знаю, что пустой массив, напечатанный в моей предыдущей попытке, означал, что моя страница с корзиной не получала правильные данные массива.

Edit: Мне нужно передать объекты модели на новую HTML-страницу, которая (от того, что я знаю) я не могу сделать с помощью JavaScript

index.html

<form id="getArr" method="POST"> 
     {% csrf_token %} 
     <button type='submit' id="checkCart">Check Added Items</button> 
</form> 
+0

Вы можете использовать визуализацию. Сначала импортируйте его из django.shortcuts import redirect, render, а затем вы можете 'return render (request, 'cart.html.html', context)'. – kapilsdv

+0

Возможный дубликат [Как сделать перенаправление страницы с помощью jQuery?] (Http://stackoverflow.com/questions/503093/how-can-i-make-a-page-redirect-using-jquery) – lorond

+0

Я пробовал используя 'window.location.href', но мне нужна страница для перенаправления из django, так как я хочу передать объектам модели на страницу. Кроме того, использование «render» дало мне тот же результат. – lena

ответ

0

Если я правильно поняли вопрос, я думаю, что вы добавляете дополнительный шаг, используя JQuery.

Решение # 1 - Создайте элемент формы на лету в jQuery и отправьте эту форму в конечную точку Django. Обычно в шаблоне рендеринга Django.

Javascript

$("#getArr").submit(function(){ 
    var url = 'cart/'; 
    var form = '<form action="' + url + '" method="post">'; 
    for (var i = 0; i < chosen.length; i++) { 
     form += '<input type="hidden" name="ab[]" value="' + chosen[i] + '" />' 
    }; 
    form += '</form>' 
    var form_element = $(form); 
    $('body').append(form_element); 
    form_element.submit(); 
}); 

И тогда, на ваш взгляд, просто возвращает шаблон, как обычно:

views.py

def cart(request): 
    if request.method == 'POST': 
    chosen = request.POST.getlist('ab[]') 
    print(chosen, file=sys.stderr) 
    template = loader.get_template('o/cart.html') 
    context = {'prodChosen': chosen, 
       'e': "hy"} 
    return HttpResponse(template.render(context, request)) 
else: 
    template = loader.get_template('o/cart.html') 
    context = {} 
    return HttpRepsonse('fail') 
    # return HttpResponse(template.render(context, request)) 

Решение # 2 - Использование jQuery .load() function функция и su bmit эту форму для вашего элемента Django. Обычно в шаблоне рендеринга Django (или в виде фрагмента, чтобы избежать повторения других элементов страницы).

Javascript

$("#getArr").submit(function(){ 
    $('#main-content-div').load('cart/', $("#getArr").serialize()); 
}); 

views.py

def cart(request): 
    if request.method == 'POST': 
    chosen = request.POST.getlist('ab[]') 
    print(chosen, file=sys.stderr) 
    template = loader.get_template('o/cart.html') 
    context = {'prodChosen': chosen, 
       'e': "hy"} 
    return HttpResponse(template.render(context, request)) 
else: 
    template = loader.get_template('o/cart.html') 
    context = {} 
    return HttpRepsonse('fail') 
    # return HttpResponse(template.render(context, request)) 

Решение # 3 - Создание типовой формы HTML с элементами имя ab[] и представить эту форму для вашего Джанго конечной точки. Обычно в шаблоне рендеринга Django.

Форма:

HTML

<form id="getArr" action="cart/" method="POST"> 
    <input type="text" name="ab[]" value="product_id_1"/> 
    <input type="text" name="ab[]" value="product_id_2"/> 
    <input type="text" name="ab[]" value="product_id_3"/> 
    <input type="submit" value="Submit" /> 
</form> 

Некоторые Javascript для добавления элементов в форму:

Javascript

$('.add_product').click(function(){ 
    $('#getArr').append('<input type="hidden" name="ab[]" value="' + $(this).attr('product_id') + '"/>') 
}) 

Джанго вид:

views.py

def cart(request): 
    if request.method == 'POST': 
    chosen = request.POST.getlist('ab[]') 
    print(chosen, file=sys.stderr) 
    template = loader.get_template('o/cart.html') 
    context = {'prodChosen': chosen, 
       'e': "hy"} 
    return HttpResponse(template.render(context, request)) 
else: 
    template = loader.get_template('o/cart.html') 
    context = {} 
    return HttpRepsonse('fail') 
    # return HttpResponse(template.render(context, request)) 
+0

У меня есть форма POST в моем HTML-файле (идентификатор формы - getArr), но как передать массив javascript в HTML без jquery? – lena

+0

, если у вас есть несколько элементов ввода в форме, все они имеют одинаковое имя ('ab []' в вашем случае), тогда Django распознает их как массив, когда эта форма будет опубликована. Я не уверен, как переменная 'selected' определена в вашем коде. Но если вы просто добавили скрытые поля в форму 'getArr' всякий раз, когда выбран продукт, который выглядит следующим образом: ' then 'request. POST.getlist ('ab []') 'вызов в вашем представлении должен работать. –

+0

Я добавил пример формы, которая будет работать на мой ответ –

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