Закрыть

Для эффективной работы на сайте используются cookie и обработка персональных данных. Пользуясь этим сайтом, вы соглашаетесь с правилами использования сайта. Подробнее

Цитата дня

Vivazzi.ru

Личный сайт Мальцева Артема

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

Дейл Карнеги

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

2 октября 2016 г. 7: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).

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

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

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

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

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

Права на использование данной статьи, расположенной на настоящей странице http://vivazzi.ru/django-shop/modeling-simple-product/:

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

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

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

Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.
Посмотреть рекомендации

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

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

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

Отправить

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

Попробуйте