3. Моделирование простого продукта

2 октября 2016 г. 11:52

В качестве простого примера в данном руководстве используется карты памяти в качестве своего первого продукта. Как подчёркивалось ранее, djangoSHOP не поставляется с готовым к использованию моделями продукта. Вместо этого продавец должен описать эти модели основанные на свойствах продукта. Давайте взглянем на модель, описывающую типичную Карту памяти:

# myshop/models/smartcard.py
from shop.money.fields import MoneyField
from shop.models.product import BaseProduct, BaseProductManager, CMSPageReferenceMixin
from shop.models.defaults.mapping import ProductPage, ProductImage
from ..manufacturer import Manufacturer
class SmartCard(CMSPageReferenceMixin, BaseProduct):
    # common product fields
    product_name = models.CharField(max_length=255, verbose_name=_("Product Name"))
    slug = models.SlugField(verbose_name=_("Slug"))
    unit_price = MoneyField(_("Unit price"), decimal_places=3,
        help_text=_("Net price for this product"))
    caption = HTMLField(verbose_name=_("Caption"),
        configuration='CKEDITOR_SETTINGS_CAPTION',
    order = models.PositiveIntegerField(verbose_name=_("Sort by"), db_index=True)
    cms_pages = models.ManyToManyField('cms.Page', through=ProductPage,

Здесь наша модель SmartCard напрямую наследуется от BaseProduct, который является классом-заглушкой, следовательно, наиболее распространённые поля, такие как product_name, slug и unit_price должны быть добавлены здесь. Позже вы поймёте, почему эти поля, даже казалось бы требуемые для каждого продукта, не могут стать частью абстрактного класса BaseProduct.

Дополнительно карты памяти могут иметь некоторые специфические свойства:

help_text=_("Short description used in the catalog's list view of products."))
    description = HTMLField(verbose_name=_("Description"),
        configuration='CKEDITOR_SETTINGS_DESCRIPTION',
        help_text=_("Description for the list view of products."))

    # product properties
    manufacturer = models.ForeignKey(Manufacturer, verbose_name=_("Manufacturer"))
    CARD_TYPE = (2 * ('{}{}'.format(s, t),)
                 for t in ('SD', 'SDXC', 'SDHC', 'SDHC II') for s in ('', 'micro '))
    card_type = models.CharField(_("Card Type"), choices=CARD_TYPE, max_length=15)
    SPEED = ((str(s), "{} MB/s".format(s)) for s in (4, 20, 30, 40, 48, 80, 95, 280))
    speed = models.CharField(_("Transfer Speed"), choices=SPEED, max_length=8)

Эти атрибуты класса в значительной степени зависят от спецификации продукта для продажи.

В заключении, мы также можем разместить наши продукты в категории и отсортировать их:

speed = models.CharField(_("Transfer Speed"), choices=SPEED, max_length=8)
    product_code = models.CharField(_("Product code"), max_length=255, unique=True)
    storage = models.PositiveIntegerField(_("Storage Capacity"),
        help_text=_("Storage capacity in GB"))

    # controlling the catalog
    order = models.PositiveIntegerField(verbose_name=_("Sort by"), db_index=True)

Поле order используется для сортировки продуктов во время рендера списка продуктов.

Поле cms_pages определяет на каких страницах CMS продукт должен отображаться.

Замечание: если категориям не требуется хранение каких-либо технических свойств, то часто достаточно использовать CMS страницы как категории.

И наконец, поле images, имеющие связь многие-ко-многим, позволяют ассоциировать с none, один или более изображений для продукта.

Оба поля cms_pages и images должны использовать парметр through. Потому что мы имеем две таблицы многие-ко-многим, которые являются частью проекта, а не приложением djangoSHOP. Первая из этих таблиц имеет внешние ключи на cms.Page моделей и myshop.SmartCard. Вторая таблица имеет внешние ключи на модели filer.Image и myshop.SmartCard снова. Так как модель myshop.SmartCard была объявлена ​​самим продавцом, он также несет ответственность за управление этими таблицами со связью многие-ко-многим.

Кроме того каждая модель продукта требует следующие атрибуты:

  • Поле или метод, названное product_name: Должен вернуть название продукта в его естественном языке.
  • Метод get_price(request): Возвращает стоимость продукта. Она может зависеть от данного региона, который доступен через объект request.
  • Метод get_absolute_url(): Возвращает канонический URL продукта.
  • Атрибут объекта должен быть типа BaseProductManager или производным от него.

Следующие атрибуты модели продукта - опциональны, но очень рекомендуемы:

  • Поле или метод, названное product_code: Будет возвращать независимый от языка код продукта (артикул).
  • Метод sample_image: Будет возвращать изображение данного продукта.

3.1. Добавление модели myshop.SmartCard в Django Admin

По причинам, которые были только что объяснены, что ответственность проекта для управления отношениями многие-ко-многим между его CMS страницами и изображениями находятся на одной стороне, а продукт - на другой стороне. Поэтому мы не можем использовать встроенный администратора виджетов FilteredSelectMultiple для этих отношений.

Вместо этого djangoSHOP поставляется со специальным классом CMSPageAsCategoryMixin, который обрабатывает связь между CMS страниц и продуктом. Этот миксин работает с полем cms_pages.

from adminsortable2.admin import SortableAdminMixin
from shop.admin.product import CMSPageAsCategoryMixin, ProductImageInline
from myshop.models import SmartCard


@admin.register(SmartCard)
class SmartCardAdmin(SortableAdminMixin, CMSPageAsCategoryMixin, admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('product_name', 'slug', 'product_code', 'unit_price', 'active', 'description',),
        }),
        (_("Properties"), {
            'fields': ('manufacturer', 'storage', 'card_type', 'speed',)
        }),
    )
    inlines = (ProductImageInline,)
    prepopulated_fields = {'slug': ('product_name',)}
    list_display = ('product_name', 'product_code', 'unit_price', 'active',)
    search_fields = ('product_name',)

Для изображений класс admin должен использовать специальный inline класс ProductImageInline. Это так, потому что продавец может потребовать установить порядок изображений и поэтому простой SelectMultiple виджет не будет выполнять эту задачу.

Для расширения нашего простого продукта для поддержки других естественных языков возможно путем моделирования Многоязычного продукта (Multilingual Product).

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

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

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

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

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

Автор перевода

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

Веб-разработчик, владеющий знаниями языка программирования Python, фреймворка Django, системы управления содержимым сайта Django CMS, платформы для создания интернет-магазина Django Shop и многих различных приложений, использующих эти технологии.

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

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

Автор перевода: Артём Мальцев
Ссылка на перевод статьи: <a href="https://vivazzi.pro/ru/django-shop/modeling-simple-product/">https://vivazzi.pro/ru/django-shop/modeling-simple-product/</a>

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

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.

Комментарии: 0

Вы можете оставить комментарий как незарегистрированный пользователь.

Но зарегистрировавшись, вы сможете:

  • получать оповещения об ответах
  • просматривать свои комментарии
  • иметь возможность использовать все функции разработанных сервисов

Для комментирования от своего имени войдите или зарегистрируйтесь на сайте Vuspace

Отправить

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

Попробуйте

Выберите валюту для отображения денежных единиц