Reputation: 49
JS code for ajax request
<script type="text/javascript">
$(document).ready(function(){
console.log("IN")
var cartUpdateForm = $('.js_cart_update_form')
cartUpdateForm.submit(function(event){
event.preventDefault()
var thisform = $(this);
var method = thisform.attr("method");
var api = thisform.attr("api");
var data_ = thisform.serialize();
var current = window.location.href
console.log(method,api,current,data_)
$.ajax({
url:api,
data:data_,
type:method,
success:function(data){
console.log("success")
console.log(data)
update_table(data)
},
error:function(data){
console.log('error')
}
});
function update_table(data){
table_ = $('.js_cart_table')
table_body_ = table_.find(".js_cart_body")
table_body_.html("")
remove_form = $(".js_remove_form")
if(data.items.length > 0){
$.each(data.items , function(index , val){
var rmf = remove_form.clone()
rmf.css('display','block')
rmf.find(".cart_item_id").val(val.id)
table_body_.prepend("<tr><td>"+val.name+"</td>
<td>"+val.price+"</td><td>"+rmf.html()+"</td></tr>")
});
}
else
{
console.log("reloading..")
window.location.href = current
}
}
});
});
</script>
updateapi in views.py:
def update_util(request):
pk = int(request.POST.get('item_id'))
rest_id = request.session['rest_id']
restaurant = Restaurant.objects.get(pk = rest_id)
cart_obj = Cart.objects.new_or_create(request)
remove = request.POST.get('remove')
item = FoodItem.objects.get(pk=pk)
# print(pk)
if remove == '1':
cart_obj.items.remove(item)
else:
cart_obj.items.add(item)
def update(request):
update_util(request)
rest_id = request.session['rest_id']
return redirect(reverse('restaurant:menu', kwargs={'pk':rest_id}))
def updateapi(request):
if request.is_ajax():
update_util(request)
cart_obj = Cart.objects.new_or_create(request)
print(request.POST.get('remove') ,'called')
items = []
data = {}
for item in cart_obj.items.all():
items.append({'name':item.name , 'price':item.price
,'id':item.id})
data_ = {'items':items , 'total':cart_obj.total ,
'subtotal':cart_obj.subtotal}
return JsonResponse(data_)
HTML Form on which call is occuring for remove:
<table class="table js_cart_table">
<thead>
<th>Item</th><th>Price</th><th></th>
</thead>
<tbody class="js_cart_body">
{% for item in cart.items.all %}
<tr><td>{{ item }}</td> <td> {{ item.price }}</td>
<td>{% include 'cart/include/remove_cart.html' with
item_id=item.id %}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="js_remove_form" style="display: none;">
{% include 'cart/include/remove_cart.html' %}</div>
</div>
remove_cart.html:
<form class='js_cart_update_form' api="{% url 'cart:update_api' %}" action="
{% url 'cart:update' %}" method='POST'>
{% csrf_token %}
<input class='cart_item_id' type="hidden" name="item_id" value= "{{
item_id }}">
<input type="hidden" name="remove" value="1">
<input class=" btn btn-xs btn-danger js_update" type='submit' value="X">
</form>
Same is for add just hidden value of remove is 0 and value of input type submit is Add.
Items in cart are added normally but when removing them first time the page reloads and the second time the ajax call happens , this happens alternatively.
Don't know why I am having this weird behaviour.
Upvotes: 0
Views: 402
Reputation: 1343
It is normal, it's beacause of the CSRF token. Try this:
var csrftoken = $('[name="csrfmiddlewaretoken"]').val();
And after include this in your Ajax request
$.ajax({
...
headers: {
'Accept': 'application/json', //if json
'Content-Type': 'application/json', //if json
"X-CSRFToken": csrftoken
},
credentials: 'include',
....
})
It worked for me
Upvotes: 1
Reputation: 525
This is because you need to set up CSRF in your AJAX request, same as you'd do in normal request.
Add the following code to your JavaScript:
// This handles generation of CSRF token
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
}
});
refer to docs: https://docs.djangoproject.com/en/2.0/ref/csrf/#ajax
I hope this helps.
Good luck!
Upvotes: 0