[英]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.