在 Django 中编写视图的最佳实践(如何注释参数、将请求转移到视图之外以及消息怎么样)

问题描述 投票:0回答:1

服务.py

def add_goods_to_cart(goods_id, user, addend):
    goods = Goods.objects.filter(pk=goods_id).first()

    if goods:

        the_goods_already_in_cart = Cart.objects.filter(user=user, goods=goods, order=None).first()

        if the_goods_already_in_cart:
            the_goods_already_in_cart.quantity = (the_goods_already_in_cart.quantity + addend)

            if the_goods_already_in_cart.quantity == 0:
                the_goods_already_in_cart.delete()
            else:
                the_goods_already_in_cart.save()

        else:
            Cart.objects.create(user=user, goods=goods, quantity=1)
        status = 200
    else:
        status = 400

    return status

views.py

class AddToCart(LoginRequiredMixin,
                View):
    def post(self, request):
        goods_id = request.POST.get('goods_id')
        addend = int(request.POST.get('addend'))

        assert (addend == 1 or addend == -1)

        status = add_goods_to_cart(goods_id, request.user, addend)
        if status == 200:
            act = "added to cart" if addend > 0 else "removed from cart"
            messages.add_message(request, messages.INFO, 'Goods "{}" {}.'.format(goods.name, act))
            return redirect(request.META['HTTP_REFERER'])
        else:
            return HttpResponse("Wrong goods id", status=status)

令我困扰的是:

  1. 我可以将请求从views.py传输到service.py吗?一个视图是 根据要求运行的东西。按照我的逻辑是合理的 不要将请求传输到视图之外。从请求接收数据, 将数据传输到服务。
  2. 什么会创建消息?按照我的逻辑,这是责任 的视图。但视图不知道任何有关名称的信息 货物。看这里:这段代码不会仅仅因为有 留言里没有货品名称。

好吧,无论如何,这段代码的架构很糟糕。也许我应该从服务返回的不是状态代码,而是添加的商品的名称?

如何重构这段代码?

django django-views
1个回答
1
投票

您不必在 service.py 中返回状态代码来了解其中发生的情况,还有一种更简单的方法可以返回商品的名称和 service.py 中发生的情况的标志,只需返回商品的名称,如果它存在,如果不存在则不存在。这样您就可以在视图中处理状态代码,并且您还可以知道该商品的名称:

goods = Goods.objects.filter(pk=goods_id).first()

if goods:
the_goods_already_in_cart = Cart.objects.filter(user=user, goods=goods, order=None).first()

if the_goods_already_in_cart:
the_goods_already_in_cart.quantity = (the_goods_already_in_cart.quantity + addend)

if the_goods_already_in_cart.quantity == 0:
the_goods_already_in_cart.delete()
else:
the_goods_already_in_cart.save()

else:
Cart.objects.create(user=user, goods=goods, quantity=1)

return goods.name # Return the name of the added goods

return None # This shows that goods were not found 
© www.soinside.com 2019 - 2024. All rights reserved.