Django Shop - интернет-магазин на Django

20 февраля 2016 г. 20:22

Шаблон spec/messages.html не найден

Несколько слов о 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

Оцените статью

0 из 5 (всего 0 оценок)

Поля, отмеченные звёздочкой ( * ) , являются обязательными.

Спасибо за ваш отзыв!

После нажатия кнопки "Отправить" ваше сообщение будет доставлено мне на почту.

Автор статьи

Права на использование материала, расположенного на этой странице http://vivazzi.pro/it/django-shop/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Мальцев Артём
Ссылка на статью: <a href="http://vivazzi.pro/it/django-shop/">http://vivazzi.pro/it/django-shop/</a>

Подробнее: Правила использования сайта

Комментариев: 2

Нариман Алимурадов
Нариман Алимурадов

10.05.2018 15:03 #

Спасибо, очень полезная статья!

Ответить

Артём Мальцев
Артём Мальцев автор

10.05.2018 20:54 #

Пожалуйста! Рад, что статья оказалось полезной!

Ответить

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

Чтобы оставить комментарий от своего имени войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте