【问题标题】:django didn't return HttpResponse Objectdjango 没有返回 HttpResponse 对象
【发布时间】:2021-10-15 16:48:04
【问题描述】:

我在 Django 中看到了很多关于 HttpResponse 对象的这个主题的答案,但我无法解决它。 通常,用户输入信息并保存数据库。 但这没有发生,因为我收到了这个错误。有什么可以帮忙的吗?

def place_order(request, total=0, quantity=0):
    current_user = request.user

    # If the cart count is less than or equal to 0, then redirect back to shop
    cart_items = CartItem.objects.filter(user=current_user)
    cart_count = cart_items.count()
    if cart_count <= 0:
        return redirect("store")

    grand_total = 0
    tax = 0
    for cart_item in cart_items:
        total += cart_item.product.price * cart_item.quantity
        quantity += cart_item.quantity
    tax = (2 * total) / 100
    grand_total = total + tax

    # ---

    if request.method == "POST":
        form = OrderForm(request.POST)
        if form.is_valid():
            # Store all the billing information inside Order table
            data = Order()
            data.user = current_user
            data.first_name = form.cleaned_data["first_name"]
            data.last_name = form.cleaned_data["last_name"]
            data.phone = form.cleaned_data["phone"]
            data.email = form.cleaned_data["email"]
            data.address_line_1 = form.cleaned_data["address_line_1"]
            data.address_line_2 = form.cleaned_data["address_line_2"]
            data.country = form.cleaned_data["country"]
            data.state = form.cleaned_data["state"]
            data.city = form.cleaned_data["city"]
            data.order_note = form.cleaned_data["order_note"]
            data.order_total = grand_total
            data.tax = tax
            data.ip = request.META.get("REMOTE_ADDR")
            data.save()
            # Generate order number
            yr = int(datetime.date.today().strftime("%Y"))
            dt = int(datetime.date.today().strftime("%d"))
            mt = int(datetime.date.today().strftime("%m"))
            d = datetime.date(yr, mt, dt)
            current_date = d.strftime("%Y%m%d")  # 20210305
            order_number = current_date + str(data.id)
            data.order_number = order_number
            data.save()
            return redirect("store")
    else:
        return redirect("checkout")

【问题讨论】:

    标签: python django web


    【解决方案1】:

    您的代码中有两个分支,三个结果。

    • 如果方法 == POST:
      • 是:如果表单有效:
        • YES:做事,返回重定向
        • ELSE:什么都不做(失败)
      • ELSE:返回重定向到结帐

    问题是您发布表单但它无效的情况;在这种情况下,您会通过另一个 else 分支并最终返回 None,这自然是无效的。

    简单的解决方法是解开最后一个else,这样如果没有成功,您总是会重定向回结帐:

    if request.method == "POST":
       if form.is_valid():
           # ...
           return ...
    return ...
    

    使用 FormView 来正确处理数据并向用户显示表单错误会更好、更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多