Применение купонов к заказам
Мы собираемся сохранять купон, который был применен для каждого заказа. Во-первых, необходимо изменить модель заказа, чтобы сохранить связанный с ней объект купона, если таковой имеется.
Измените файл 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/ и проверить, что заказ содержит купон и примененную скидку: