Создание заказов клиентов

Нам нужно использовать только что созданные модели заказов для сохранения товаров, содержащихся в корзине для покупок, когда пользователь наконец пожелает разместить заказ. Функции создания нового заказа будут работать следующим образом:

  1. Мы предоставляем форму заказа для заполнения пользовательских данных.
  2. Создается новый экземпляр заказа с данными, введенными пользователями, а затем создается связанный экземпляр OrderItem для каждого товара в корзине.
  3. Очистищаем все содержимое корзины и перенаправляем пользователей на страницу success

Во-первых, нам нужна форма для ввода сведений о заказе. Создайте новый файл в каталоге приложения orders и назовите его forms.py. Добавьте в него следующий код:

from django import forms
from .models import Order


class OrderCreateForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['first_name', 'last_name', 'email', 'address', 'postal_code', 'city']

Это форма, которую мы собираемся использовать для создания новых объектов Order. Теперь нам нужно представление, чтобы обработать форму и создать новый заказ. Измените файл views.py приложения orders и добавьте в него следующий код:

from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart


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()
            return render(request, 'orders/order/created.html',
                          {'order': order})
    else:
        form = OrderCreateForm
    return render(request, 'orders/order/create.html',
                  {'cart': cart, 'form': form})

В представлении order_create мы получаем текущую корзину из сесссии с cart = Cart(request). В зависимости от метода запроса мы будем выполнять следующие задачи:

  • GET request : Создается экземпляр формы OrderCreateForm и отображается шаблон orders/order/create.html
  • POST request : Проверяет валидность введенных данных. Если данные являются допустимыми, то для создания нового экземпляра заказа будет использоваться order = form.save(). Затем мы сохраняем его в базу данных, а затем храним в переменной order. После создания заказа мы перейдем по товарам корзины и создадим OrderItem для каждого из них. Наконец, мы очищаем содержимое корзины

Теперь создайте новый файл в каталоге приложения orders и назовите его urls.py. Добавьте в него следующий код:

from django.conf.urls import url
from . import views


urlpatterns = [
    url(r'^create/$', views.order_create, name='order_create'),
]

Это шаблон URL-адреса для представления order_create. Отредактируйте файл urls.py myshop и включите следующий шаблон. Не забывайте, его следует разместить перед паттерном shop.urls:

url(r'^orders/', include('orders.urls', namespace='orders')),

Отредактируйте шаблон cart/detail.html приложения cart и замените эту строку:

<a href="#" class="button">Checkout</a>

На следующий код:

<a href="{% url "orders:order_create" %}" class="button">
    Checkout
</a>

Теперь пользователи могут перейти от страницы cart detail к странице order form. Нам по-прежнему необходимо определить шаблоны для размещения заказов. Создайте следующую структуру файла в каталоге приложения orders:

templates/
    orders/
        order/
            create.html
            created.html

Отредактируйте шаблон orders/order/create.html:

{% extends "shop/base.html" %}

{% block title %}Checkout{% endblock %}

{% block content %}
    <h1>Checkout</h1>
    <div class="order-info">
        <h3>Your order</h3>
        <ul>
            {% for item in cart %}
                <li>
                    {{ item.quantity }}x {{ item.product.name }}
                    <span>${{ item.total_price }}</span>
                </li>
            {% endfor %}
        </ul>
        <p>Total: ${{ cart.get_total_price }}</p>
    </div>
    <form action="." method="post" class="order-form">
        {{ form.as_p }}
        <p><input type="submit" value="Place order"></p>
        {% csrf_token %}
    </form>
{% endblock %}

Этот шаблон отображает товары корзины, включая итоговую сумму, и форму для размещения заказа.

Отредактируйте шаблон orders/order/created.html:

{% extends "shop/base.html" %}

{% block title %}Thank you{% endblock %}

{% block content %}
    <h1>Thank you</h1>
    <p>Your order has been successfully completed. Your order number is
        <strong>{{ order.id }}</strong>.</p>
{% endblock %}

Это шаблон, который мы показываем при успешном создании заказа. Запустите сервер веб-разработки. Откройте / в браузере http://127.0.0.1:8000, добавьте в корзину несколько товаров и нажмите на ссылку checkout. Появится страница, подобная следующей:

Заполните форму валидными данными и нажмите кнопку Place order. Заказ будет создан, и появится страница сообщающая об успешном выполнении действия:

results matching ""

    No results matching ""