Применение купонов к заказам

Мы собираемся сохранять купон, который был применен для каждого заказа. Во-первых, необходимо изменить модель заказа, чтобы сохранить связанный с ней объект купона, если таковой имеется.

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

from decimal import Decimal
from django.core.validators import MinValueValidator, MaxValueValidator
from coupons.models import Coupon

Затем добавьте в модель Order следующие поля:

coupon = models.ForeignKey(Coupon,
                                related_name='orders',
                                null=True,
                                blank=True)
discount = models.IntegerField(default=0,
                                    validators=[MinValueValidator(0),
                                                MaxValueValidator(100)])

Эти поля позволят сохранить дополнительный купон, примененный к заказу, и скидку, примененную купоном. Скидка хранится в соответствующем объекте купона, но мы включаем ее в модель заказа, чтобы сохранить ее при изменении или удалении купона.

После изменения модели заказа необходимо создать миграцию. Выполните следующую команду из командной строки:

python manage.py makemigrations

На выходе вы увидите следующие строки:

Migrations for 'orders':
    0002_auto_20150606_1735.py:
        - Add field coupon to order
        - Add field discount to order

Примените новую миграцию следующей командой:

python manage.py migrate orders

Вы получите подтверждение применения новой миграции. Изменения полей модели заказа теперь синхронизируются с базой данных.

Вернитесь в файл models.py и измените метод get_total_cost() модели Order:

def get_total_cost(self):
    total_cost = sum(item.get_cost() for item in self.items.all())
    return total_cost - total_cost * (self.discount / Decimal('100'))

В методе get_total_cost() модели Order теперь учитывается примененная скидка, если таковая имеется.

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

order = form.save()

Замените ее следующим кодом:

order = form.save(commit=False)
if cart.coupon:
    order.coupon = cart.coupon
    order.discount = cart.coupon.discount
order.save()

В новом коде мы создаем объект Order с помощью метода save() формы OrderCreateForm. Мы не можем сохранить его в базе данных с помощью команды commit=False. Если корзина содержит купон, мы сохраняем связанный купон и применяемую скидку. Затем мы сохраняем объект order в базу данных.

Запустите Ngrok из терминала, используя следующую команду:

./ngrok http 8000

Откройте URL-адрес, предоставленный Ngrok в браузере, и завершите покупку с помощью созданного купона. По завершении успешной покупки можно перейти к http://127.0.0.1:8000/admin/orders/order/ и проверить, что заказ содержит купон и примененную скидку:

results matching ""

    No results matching ""