django не вернул объект HttpResponse

#python #django #web

Вопрос:

Я видел много ответов об этой теме объекта HttpResponse в Django, но я не могу ее решить. Обычно пользователь вводит информацию, и база данных сохраняется. Но этого не происходит, так как я получаю эту ошибку. Есть ли что-то, что может помочь?

 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")
 

Ответ №1:

В коде есть две ветви с тремя результатами.

  • если метод == ОПУБЛИКОВАТЬ:
    • ДА: если форма действительна:
      • ДА: делайте дела, возвращайте перенаправление
      • ОСТАЛЬНОЕ: ничего не делай (проваливайся)
    • ДРУГОЕ: возврат перенаправления на оформление заказа

Проблема заключается в том случае , когда вы ОТПРАВЛЯЕТЕ форму, но она недействительна; в этом случае вы попадаете в другую ветку else и в конечном итоге возвращаетесь None , что, естественно, недопустимо.

Простое решение заключается в том, чтобы развернуть последнюю else , чтобы вы всегда перенаправляли обратно на выписку, если она не удалась:

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

Было бы лучше и проще использовать представление формы для правильной обработки данных и отображения ошибок формы пользователю.