我的视图中有两种方法,我尝试用第一种方法检查重定向,但不知道如何做。两种方法> order_create
和order_success
。在模板order_success
中,具有有关用户信息和订单信息的值,以及购物车清算作品。我要检查我的重定向。
views.py
def order_create(request):
cart = Cart(request)
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()
return redirect('order:order_success')
else:
form = OrderCreateForm()
return render(request, 'orders/order_create.html', {'cart':cart, 'form':form})
def order_success(request):
if order_create_method_redirect:
order = Order.objects.order_by('id').last()
return render(request, 'orders/order_success.html', {'order':order})
else:
return HttpResponse('Empty page')
urls.py
app_name = 'order'
urlpatterns = [
url(r'^order$', views.order_create, name='order_create'),
url(r'^order/success$', views.order_success, name='order_success'),
]
答案 0 :(得分:1)
我认为对您来说主要的问题是您没有使用reverse
来获取要传递给redirect
的URL。但是,您还需要解决其他一些问题。
一个是您应该在传递给POST进行渲染的上下文中包括无效的表单。这样,错误可以显示给用户。
第二个是您的设计将不支持同时下多个订单。如果在时间A发生了X个订单,那么这些用户都在同时order_success
查找最新的订单,他们都将看到绝对的最后一个订单。相反,您应该在URL中包含订单ID,并在成功后重定向到该特定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})
您还需要更改order_success
的urls.py条目以包含order_id kwarg。