视图 basket.views.basket_remove 没有返回 HttpResponse 对象。它返回 None 而不是
Posted
技术标签:
【中文标题】视图 basket.views.basket_remove 没有返回 HttpResponse 对象。它返回 None 而不是【英文标题】:The view basket.views.basket_remove didn't return an HttpResponse object. It returned None instead 【发布时间】: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']>
【参考方案1】:
如果代码没有到达条件块,您必须至少返回一个默认响应。
试试这样:
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
return JsonResponse('details': 'There is no action key in post request')
只需根据您的业务案例修改代码,为避免错误,您至少必须在没有条件匹配的情况下返回默认响应。
【讨论】:
以上是关于视图 basket.views.basket_remove 没有返回 HttpResponse 对象。它返回 None 而不是的主要内容,如果未能解决你的问题,请参考以下文章
word中一共有几种视图方式,并且如何区分几种视图关系,如:页面视图、大纲视图等等