视图 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中一共有几种视图方式,并且如何区分几种视图关系,如:页面视图、大纲视图等等

机械制图中,视图是怎么定义和区分!(详细点)

时间线视图、日视图、周视图、月视图和添加事件日历颤振库? [关闭]

myApps视图

mysql 视图