簡體   English   中英

如何僅在用戶登錄時運行 ajax。(Django)

[英]How to run ajax only when user is logged in. (Django)

我有多個可以通過單擊相應按鈕添加到購物車的項目。 每個項目都是一個包含有關 itemid 信息的表單,“addtocart”按鈕是表單的提交按鈕。

我正在使用 ajax 在數據庫中進行更改,然后重新加載頁面以反映它們。

Html

<script type="text/javascript">

    $(document).on('submit','.addtocart',function(e){

        e.preventDefault();
        var a=$(this).find('input[name=itemid]').val();

        $.ajax({              

          type:'POST',
          url:'addtocart',
          data:{
            itemid:a,
            'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
          }
          });
          setTimeout(() => { document.location.reload(true);} , 100);


    });
</script>

視圖.py

@login_required(login_url='/userhome')
def addtocart(request):
    if request.method == "GET":
        return redirect('/')
    else:

        product_id = request.POST['itemid']
        product_quantity = 1
        cart = usercart.objects.all().filter(user_id = request.user.id, product_id = product_id )
        try:
            if cart[0] is not None:
                cart = usercart.objects.get(user_id = request.user.id, product_id=product_id)
                cart.product_quantity+=1
                cart.save()

            else:
                cart = usercart(product_id=product_id, user_id=request.user.id, product_quantity=product_quantity)
                cart.save()
        except IndexError:
                cart = usercart(product_id=product_id, user_id=request.user.id, product_quantity=product_quantity)
                cart.save()
        return redirect('checkout')

如果用戶未登錄並且單擊了 addtocart 按鈕,我想重定向到登錄頁面('/userhome')。 我試過把我的 Js 包在里面

{% if user.is_authenticated %} 
  <script>
  ...
  </script>
{% endif %}

但由於這個原因,用戶在登錄之前看不到產品。我希望用戶在沒有登錄的情況下看到產品,但 addtocart 按鈕應該在這兩種情況下都有效,重定向到未登錄的用戶並為登錄的用戶添加產品在。

您應該為您的ajax方法使用statusCode回調。 這也將防止 POST 請求花費超過 100 毫秒並且在更新數據庫之前重新加載頁面的任何問題。

您還在結帳頁面的請求中返回重定向,ajax 請求通常不應收到重定向響應。 您應該返回一個成功狀態碼,這里我使用 http 響應,但 JSON 響應會更好。

return HttpResponse("", status=200)

如果用戶未登錄,則返回與未經授權相關的響應代碼

return HttpResponse("", status=401)

使用上述方法而不是使用@login_required裝飾器,因為它將返回重定向。

然后,您可以使用statusCode回調在 ajax 方法中處理此問題:

$.ajax({              
    type:'POST',
    url:'addtocart',
    data:{
        itemid:a,
        'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
    },
    statusCode: {
        200: function() {
            // Success! Reload the page
            document.location.reload(true);
        },
        401: function() {
            // Unauthorized, redirect to home
            window.location.href = "/userhome";
        },
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM