我想在购物车中添加产品而不用 AJAX 和 Django 刷新页面

Posted

技术标签:

【中文标题】我想在购物车中添加产品而不用 AJAX 和 Django 刷新页面【英文标题】:I want to add product in cart without refreshing page with AJAX and Django 【发布时间】:2021-05-09 19:02:53 【问题描述】:

当我在购物车中提交产品时,什么都不会发生。我想在不刷新页面的情况下使用 AJAX。 当我提交控制台消息时将显示。 我正在尝试首先使用 AJAX。 尝试在不刷新页面的情况下将产品添加到购物车中。 我需要帮助:)

查看 Django

def add_cart(request, product_id):
    cart = Cart(request)
    product = get_object_or_404(Product, id=product_id)

    form = CartProductForm(request.POST)
       
    if form.is_valid():
        cd = form.cleaned_data
        cart.add(product=product,
                quantity=cd['quantity'],
                update_quantity=cd['update_qt']
                )
                
    return JsonResponse('status': 'success') 

表格

from django import forms
from django.core.validators import MinValueValidator, MaxValueValidator

class CartProductForm(forms.Form):
    quantity = forms.IntegerField(initial=1)
    update_qt = forms.BooleanField(required=False, initial=False, widget=forms.HiddenInput)

HTML 代码

<form action="% url "..." %"  method="post" data-id=" ... " class="form-order" id="form">
     cart_product_form 
    % csrf_token %
    <a data-id=" ... " class="buy-product"><button>BUY</button></a>
</form>

JS 代码

        $(".buy-product").on('click', function(e)
            e.preventDefault();
            var product_id = $(this).attr('data-id')
            var quantity = 1
            console.log(product_id)
            console.log(quantity)

            data = 
                'product_id': product_id,
                'quantity': quantity
            
            var point='/cart/add/'+product_id+'/'
            
            $.ajax(
                headers:
                'Content-Type':'application/json',
                'X-CSRFToken':csrftoken,
                ,
                url: point,
                type: 'POST',


                data: data,

                success: function(data)
                    console.log('success')
                    console.log(csrftoken)
                    
                
        )
    )


【问题讨论】:

【参考方案1】:

您可以阻止表单刷新页面,然后使用您的 JS 代码执行您需要的任何操作:

<form action="% url "..." %"  method="post" data-id=" ... " class="form-order" id="form" onsubmit="myFunction(event)">
...
</form>
<script>
function myFunction(event)
    event.preventDefault();

</script>

【讨论】:

当我这样做时,什么都不会发生。 这实际上就是它的作用——防止表单提交时的默认行为,包括页面重新加载,让您以任何您需要的方式自行处理。 如何防止表单的默认行为? PreventDefault 允许不重新加载页面。 表单的默认行为是发送post请求,点击提交按钮后,导致页面重新加载。当您使用 preventDefault 时,您将独自发送帖子请求和处理响应。【参考方案2】:

您需要在数据中添加csrftoken:csrfmiddlewaretoken':csrftoken。我也看不到你什么时候初始化你的变量,但我认为这只是一个例子。检查此答案以获取更多信息:link

【讨论】:

当我在视图中单击添加 is_ajax 方法时出现错误 500。 想一想。我刚刚看到您将带有一些 id 的数据 point 硬编码 url。在您的情况下,没有必要输入product_id 参数,但如果您更愿意保留它,只需检查此answer。我想注意到你解决问题的方法比仅仅删除 url product_id 参数要困难得多。看看你已经在数据中发送了这个变量。为什么要复制它?

以上是关于我想在购物车中添加产品而不用 AJAX 和 Django 刷新页面的主要内容,如果未能解决你的问题,请参考以下文章

在woocommerce中使用ajax删除购物车中的产品

ajax 上的 JS 警报添加到购物车以获取 Woocommerce 中的特定产品类别计数

在 Woocommerce 中的产品自定义循环上启用 Ajax 添加到购物车按钮

WooCommerce 产品循环中添加 Ajax 选项的复选框添加到购物车

Woocommerce 更新结帐 ajax

用于 WooCommerce 3 中产品变化的 Ajax 添加到购物车按钮