Как я могу проверить перенаправление в методе> Django - PullRequest
0 голосов
/ 15 мая 2019

У меня есть два метода на мой взгляд, и я пытаюсь проверить перенаправление в первом методе, но не знаю, как это сделать. Два метода> 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'),
]

1 Ответ

1 голос
/ 15 мая 2019

Я думаю, что основная проблема для вас заключается в том, что вы не используете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...