Я думаю, что основная проблема для вас заключается в том, что вы не используете reverse
, чтобы заставить URL перейти на redirect
. Однако у вас есть несколько других проблем, которые вы должны исправить.
Во-первых, вы должны включить недопустимую форму в контекст, передаваемый для рендеринга в POST. Таким образом, ошибки могут отображаться пользователю.
Во-вторых, ваш дизайн не поддерживает одновременное размещение нескольких заказов. Если X-заказы происходят в момент времени A, тогда все эти пользователи order_success
ищут последний заказ одновременно, все они будут видеть абсолютный последний заказ. Вместо этого вы должны включить идентификатор заказа в URL и перенаправить на этот конкретный URL в случае успеха.
from django.shortcuts import get_object_or_404
from django.urls import reverse
def order_create(request):
cart = Cart(request)
# Default to a basic form for the GET path. POST will override it.
form = OrderCreateForm()
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(
order=order, product=item['product'],
price=item['price'], quantity=item['quantity']
)
cart.clear_session()
# Only redirect on absolute success
return redirect(
reverse('order:order_success', kwargs={'order_id': order.id})
)
# Return the invalid form on POST
return render(request, 'orders/order_create.html', {'cart':cart, 'form':form})
def order_success(request, order_id):
order = get_object_or_404(Order, id=order_id)
return render(request, 'orders/order_success.html', {'order':order})
Вам также нужно изменить запись urls.py на order_success
, чтобы включить kwarg order_id.