Django Shop - интернет-магазин на Django
21 февраля 2016 г. 1:22
Внимание!
- Данная статья, во-первых, не закончена, а во-вторых, постоянно редактируется! Сейчас она больше напоминает на изложение моих мыслей и рассуждений о Django Shop, а также содержит попытки прикручивания на существующий проект.
- Мною переводится документация по Django Shop: Перевод Django Shop
Несколько слов о Django Shop
На момент написания статьи это свежая версия, которая постоянно усовершенствуется разными разработчиками. По возможности я и сам стараюсь участвовать в развитии Django Shop.
Rief Jacob - разработчик, который взялся за тотальную переработку кода старой версии django-shop 0.2. И я ему очень благодарен за такую огромную проделанную работу и благодарен всем тем, кто развивает Django Shop!
Запуск проекта с гитхаба
Описание можно найти на странице pycharm run/debug configuration. Примеры конфигураций
Установка
Интеграция в существующий проект. В принципе, всё нормально получается с установкой, никаких замечаний нет, поэтому прошу к прочтению раздел 17. Конфигурация и настройки.
Money
# settings.py SHOP_DEFAULT_CURRENCY = 'USD' # Формат отображения данных SHOP_MONEY_FORMAT = '{amount} {currency}'
# Для локализованного отображения стоимости django.utils.numberformat.format(someamount)
Чтобы было без копеек: DECIMAL_PLACES = 0
Убираем parent_classes с плагинов
Мне не нравится, что плагины требуют в качестве родителя плагины Bootstrap. Это вынуждает нас их использовать, но можно это исправить. Для этого нужно добавить cms_plugins.py в приложение myshop:
# myshop/cms_plugins.py from cms.plugin_pool import plugin_pool shop_cart_plugin = plugin_pool.get_plugin('ShopCartPlugin') shop_cart_plugin.require_parent = False shop_cart_plugin.parent_classes = ()
Страницы и их ID
Для полной работоспособности реверсов нужно создать страницы со следующими ID (ID ставится в расширенных настройках страницы):
Каталог:
- 'Корзина' - id = shop-cart
- 'Просмотренные товара/список желаний' - id = shop-watch-list (shop-watch в версиях Django shop ниже 0.9.3)
Заказы:
- 'Мои заказы' - id = shop-order, app = View Orders
- 'Спасибо за покупку' - id = shop-order-last, app = View Orders
Поиск:
- 'Поиск' - id = shop-search-product app = Search
Личный кабинет
- 'Регистрация пользователя' - id = shop-register-customer
- 'Личные данные' - id = shop-customer-details (personal-details в версиях Django shop ниже 0.9.3)
- 'Сброс пароля' - id = shop-password-reset (reset-password в версиях Django shop ниже 0.9.3)
Попытки выпилить angular
Вся экосистема Django-shop построена на angular. У меня были попытки выпилить angular, и практически мне это удалось, но есть такая функциональность (например, поиск или страница Оформления заказа), которая работает с angular, причём это, как я понял взаимодействует ещё и с вьюхами. В общем отказаться от него крайне сложно. Пока его оставил.
Расширение CartItem
При добавлении внешнего ключа к модели CartItem почему-то механизм сериализации (REST framework) перестаёт видеть внешний ключ product (который определён в базовом классе BaseCartItem).
operations = [ migrations.RemoveField( model_name='cartitem', name='product', ), ]
Возможно, это связано с deferred. Нашёл решение:
# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.core.validators import MinValueValidator from django.db import models # from myshop.models.product import ProductColor # импорт как раз таки мешал REST framework-у или deferred увидеть внешний ключ product from shop.models import cart class CartItem(cart.BaseCartItem): quantity = models.IntegerField(validators=[MinValueValidator(0)]) color = models.ForeignKey('myshop.ProductColor', verbose_name='Цвет') # Прописываем строкой 'myshop.ProductColor', а не импортируем класс size = models.CharField('Размер', max_length=5, null=True, blank=True)
Добавление доп. пути в SASS_PROCESSOR_INCLUDE_DIRS
Почему-то не находятся файлы scss, поэтому пришлось в settings.py в переменную SASS_PROCESSOR_INCLUDE_DIRS добавить путь до /shop/static/
:
SASS_PROCESSOR_INCLUDE_DIRS = ( os.path.join(ROOT_DIR, 'node_modules'), os.path.join(ROOT_DIR, 'env/lib/python2.7/site-packages/shop/static/'), )
Но это случилось однажды и больше не повторяется. Надеюсь и не будет :) Через некоторое время я удалю данный абзац, если всё будет ок.
Не выводятся товары на странице без поля caption
Не выводятся товары на странице (которая имеет приложение "Категория товаров"). Причина: отсутствие поля caption в админке.
Временное решение:
class Product(CMSPageReferenceMixin, TranslatableModelMixin, BaseProduct): ... def save(self, *args, **kwargs): if not self.caption: self.caption = '' return super(Product, self).save(*args, **kwargs)
Запуск демо проекта
Открыть терминал, где находятся папки shoptutorial и Tutorial и набрать:
$ source shoptutorial/bin/activate (shoptutorial)$ cd Tutorial/django-shop/example/ (shoptutorial)$ export DJANGO_SHOP_TUTORIAL=polymorphic (shoptutorial)$ export DJANGO_DEBUG=True (shoptutorial)$ ./manage.py runserver 8001
Поиск
Для полнотекстового поиска используется пакет elasticsearch. Подробнее на странице: Установка и запуск ElasticSearch
Похожие статьи:
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 2
10.05.2018 19:03 #
Спасибо, очень полезная статья!
Ответить
11.05.2018 0:54 #
Пожалуйста! Рад, что статья оказалось полезной!
Ответить