He almacenado algunos datos en localStorage (Itemnames e ItemIds), ahora quiero enviar itemid's a las vistas de django desde ajax. Tengo conocimientos básicos de django y aprendizaje de Javascript. Traté de resolverlo por mí mismo, pero han pasado más de 4 días y no pude tener éxito, cualquier ayuda será muy apreciada.
Mi JavaScript:
$(document).ready(function() { var compare = localStorage.getItem("comparisionItems"); var compareObj = JSON.parse(compare); var data_url = window.location.href; console.log(compare) console.log(compareObj) $.ajax({ url: './compare', type: "POST", data: {'compare_id': compareObj }, headers: { "X-CSRFToken": $.cookie("csrftoken") }, dataType: "json", success: function (data) { console.log(data) }, error: function () { alert("Some problem on passing data"); } }); });Mis puntos de vista:
def compare(request): is_ajax = request.headers.get('X-Requested-With') == 'XMLHttpRequest' if is_ajax and request.method == "POST": compare_id= request.POST.getlist('compare_id[itemIds]') """compare_id=request.POST.getlist('itemIds[]') """ """compare_id = request.POST.get('compare_id')""" product = get_object_or_404(Products, id=compare_id) context={ 'product':product} """ return render (request, './ecommerce/compare.html', context)""" return render (request, './compare.html', context) else: context = None return render(request,'./compare.html', context)¿Cómo puedo obtener los productos que tienen pase de identificación por ajax? ¿Y hay alguna forma diferente de pasar esos productos a la plantilla o puedo hacerlo como el proceso de contexto de Django normal?
En su ajax, debe secuenciar la parte de datos de esta manera:
$.ajax({ // rest of the code data: JSON.stringify({'compare_id': compareObj}), headers: { "X-CSRFToken": $.cookie("csrftoken") }, dataType: "json", contentType: "application/json", success: function (data) { console.log(data); // access your response as data.product }, // rest of the code });Y luego en tu vista:
import json from django.http import JsonResponse def compare(request): is_ajax = request.headers.get('X-Requested-With') == 'XMLHttpRequest' if is_ajax and request.method == "POST": compare_id = json.loads(request.POST.get('compare_id')) ids = compare_id.get('compare_id') # ids will be list of ids and you can get first id with index product = get_object_or_404(Products, id=ids[0]) # rest of code return JsonResponse({'product': product})Pase la cadena json de su solicitud ajax.
$.ajax({ url: './compare', type: "POST", data: JSON.stringify({'compare_id': compare }), headers: { "X-CSRFToken": $.cookie("csrftoken") }, dataType: "json", contentType : "application/json", success: function (data) { $.each(data, function (key, value) { if (key == "products") { for (var i = 0; i < data[key].length; i++) { var wishlistUrl = "{% url 'ecommerce:add_to_wishlist' %}"; var div = '<div class="compare-col compare-product">'; div += '<a href="#" class="btn remove-product"><i class="w-icon-times-solid"></i></a>'; div += '<div class="product text-center"><figure class="product-media">'; div += '<a href="product.html"><img src="' + data[key][i].product_feature_image.image.url + '" alt="Product" width="228" height="257" />'; div += '</a><div class="product-action-vertical"><a href="#" class="btn-product-icon btn-cart w-icon-cart"></a>'; div += '<a href="#" class="btn-product-icon btn-wishlist w-icon-heart" title="Wishlist" attr_id="' + data[key][i].id + '" '; div += ' action_url="' + wishlistUrl + '">'; div += '</a></div></figure><div class="product-details"><h3 class="product-name"><a href="product.html">' + data[key][i].name + '</a></h3>'; div += '</div></div></div>'; $('#parentDivElementId').append(div); #--- your parent div element id } } }) }, error: function () { alert("Some problem on passing data"); } }); Y en tus views.py
Obtener datos POST primero
import json from django.shortcuts import get_list_or_404, render def compare(request): is_ajax = request.headers.get('X-Requested-With') == 'XMLHttpRequest' if is_ajax and request.method == "POST": data = json.loads(request.body) compare_ids = data['compare_id']["itemIds"] if 'itemIds' in data['compare_id'] else [] # since here multiple ids may come you need to use `filter` instead you will get get() returned more than one Products -- it returned 2! products = Products.objects.filter(id__in=compare_ids).values() return JsonResponse({'products ': list(products) }, safe=False) #---- since Queryset is not JSON serializable else: context = None return render(request,'./compare.html', context) En su consola puede ver los datos de sus products .