#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 ...
Было бы лучше и проще использовать представление формы для правильной обработки данных и отображения ошибок формы пользователю.