【发布时间】:2021-10-06 17:47:11
【问题描述】:
谁能解释一下为什么会出现这个错误?
我正在创建在线商店,其中购物篮功能取决于 cookie 中的 sessionid。
看,我在店里的每个产品上都有一个函数basked_add,它将指定的产品添加到购物篮中,它可以正常工作,没有任何问题。
我还有一个功能 basket_delete in basket 从篮子中删除指定的产品,但不知何故它不能正常工作。这就是我提出这个问题的主要原因。
函数basket_delete被JQuery这样调用(等于basked_add):
1. basket.html
$(document).on('click', '#remove-button', function (e) {
e.preventDefault();
$.ajax({
type: 'POST',
url: '{% url "basket:basket_delete" %}',
data: {
productid: $('#add-button').val(),
csrfmiddlewaretoken: "{{csrf_token}}",
action: 'post',
},
success: function (json) {
},
error: function (xhr, errmsg, err) {}
});
})
2. 篮子 > urls.py
app_name = 'basket'
urlpatterns = [
path('', views.basket, name='basket'),
path('add/', views.basket_add, name='basket_add'),
path('delete/', views.basket_delete, name='basket_delete'),
]
3. 然后函数正在执行
篮子>views.py
from django.http.response import JsonResponse
from basket.basket import Basket
def basket_delete(request):
basket = Basket(request)
if request.POST.get('action') == 'post':
product_id = int(request.POST.get('productid'))
basket.delete(product=product_id)
response = JsonResponse({'Success': True})
return response
篮子 > context_processors.py
from .basket import Basket
def basket(request):
return {'basket': Basket(request)}
篮子 > 篮子.py
class Basket():
def delete(self, product):
product_id = str(product.id)
if product_id in self.basket:
del self.basket[product_id]
self.session.modified = True
在控制台出现错误:
POST http://127.0.0.1:8000/basket/delete/ 500(内部服务器错误)
在 url http://127.0.0.1:8000/basket/delete/ 来自 django 的调试:
视图 basket.views.basket_delete 未返回 HttpResponse 对象。它返回 None 。
其中最奇怪的是basked_add 也没有渲染任何视图,并且它工作正常,但是对于basket_delete 发生错误。
basked_add 视图
def basket_add(request):
basket = Basket(request)
if request.POST.get('action') == 'post':
product_id = int(request.POST.get('productid'))
quantity = int(request.POST.get('quantity'))
size = int(request.POST.get('size'))
product = get_object_or_404(Product, id=product_id)
basket.add(product=product, quantity=quantity, size=size)
basket_quantity = basket.__len__()
response = JsonResponse({'quantity': basket_quantity})
return response
【问题讨论】:
-
条件
if request.POST.get('action') == 'post':为假,所以不返回响应... -
@WillemVanOnsem 但在脚本中我在数据中指定了“action:'post'”并且对于 basked_add 它有效,那么为什么它不应该用于 basked_delete
-
你能
print(request.POST)(if之前)。通常键被转换为大写 -
是的,我可以@WillemVanOnsem
<QueryDict: {'csrfmiddlewaretoken': ['IjEtvPLymWeRZZG3V0DNlxgOsjXVvviZiBCkE1RMt4B0JROE7AkX4yzhPsOSpvq1'], 'action': ['post']}>