用于ajax请求的JS代码
<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>
views.py中的updateapi:
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表单:
<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>
与之相同,只是将remove的隐藏值设为0,将输入类型Submit的值设为Add。
购物车中的项目通常是添加的,但是在第一次重新加载页面并第二次执行ajax调用时将其删除时,则交替发生。
不知道为什么我会有这种奇怪的行为。
答案 0 :(得分:1)
这是正常的,因为CSRF令牌。 试试这个:
var csrftoken = $('[name="csrfmiddlewaretoken"]').val();
然后将其包含在您的Ajax请求中
$.ajax({
...
headers: {
'Accept': 'application/json', //if json
'Content-Type': 'application/json', //if json
"X-CSRFToken": csrftoken
},
credentials: 'include',
....
})
对我有用
答案 1 :(得分:0)
这是因为您需要在AJAX请求中设置CSRF,就像在正常请求中一样。
将以下代码添加到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'));
}
}
});
请参阅文档:https://docs.djangoproject.com/en/2.0/ref/csrf/#ajax
我希望这会有所帮助。
祝你好运!