简体   繁体   English

如何从 JavaScript ajax 调用和打印来自 Django 模板中视图的返回数据

[英]How can I send localstorage data from JavaScript ajax call and print return data from views in Django template

I have stored some data on localStorage( Itemnames and ItemIds), now I want to send itemid's to django views from ajax.我已经在 localStorage(Itemnames 和 ItemIds)上存储了一些数据,现在我想从 ajax 将 itemid 发送到 django 视图。 I have basics knowledge of django and learning Javascript.我有 django 和学习 Javascript 的基础知识。 I tried to figureit out by myself but its been more than 4 days I could not succeed, any help will be highly appreciated.我试图自己弄清楚,但已经超过 4 天我无法成功,任何帮助将不胜感激。

My Javascript:我的 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");
        }
        
    });
});

获取 localstorageitmes 后,控制台返回如下所示:

My views:我的看法:

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)

How can I get the products which have id's pass by ajax? ajax怎么才能拿到id's pass的产品? And is there any different ways to pass those products to the template or I can do it just like the regular Django context process?是否有任何不同的方法可以将这些产品传递给模板,或者我可以像常规的 Django 上下文过程一样做到这一点?

In your ajax you should stringify the data part like this:在您的 ajax 中,您应该像这样对数据部分进行字符串化:

 $.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
});

And then in you view:然后在你看来:

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})

Pass json string from your ajax request.从您的 ajax 请求中传递 json 字符串。

$.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");
     }
  });

And in your views.py在你的views.py

Get POST data first先获取 POST 数据

 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)

In your console you can see your products data.在您的控制台中,您可以看到您的products数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM