4. Моделирование мультиязычного продукта

2 октября 2016 г. 13:14

Давайте расширим нашу предыдущую модель SmartCard для интернационализации нашего интернет-магазина. Обычно, имя модели Smart Card международное в любом случае, например “Ultra Plus micro SDXC”, поэтому, возможно, не имеет смысла делать это поле переводимым. Атрибут модели, которое, безусловно, имеет смысл быть переводимым в разные языки, это поле "Описание".

4.1. Запуск Мультиязычного демо-проекта

Для запуска этого примера нужно установить переменную окружения:

export DJANGO_SHOP_TUTORIAL=i18n_smartcard

а затем применить измененные модели в схему базы данных:

./manage.py migrate myshop

Как вариант можно воссоздать базу данных как описано в разделе Создание базы данных для демо-проекта.

Далее можно запустить демо-сервер:

./manage.py runserver

4.2. Мультиязычная модель продукта

DjangoSHOP использует библиотеку django-parler для перевода моделей. Поэтому мы перепишем нашу модель следующим образом:

myshop/models/i18n_smartcard.py

from djangocms_text_ckeditor.fields import HTMLField
from parler.managers import TranslatableManager, TranslatableQuerySet
from parler.models import TranslatableModelMixin, TranslatedFieldsModel
from parler.fields import TranslatedField
from polymorphic.query import PolymorphicQuerySet
from shop.money.fields import MoneyField
from shop.models.product import BaseProductManager, BaseProduct, CMSPageReferenceMixin
from shop.models.defaults.mapping import ProductPage, ProductImage
from ..manufacturer import Manufacturer

class ProductQuerySet(TranslatableQuerySet, PolymorphicQuerySet):
    pass

class ProductManager(BaseProductManager, TranslatableManager):
    queryset_class = ProductQuerySet
        qs = self.queryset_class(self.model, using=self._db)
        return qs.prefetch_related('translations')


@python_2_unicode_compatible
class SmartCard(CMSPageReferenceMixin, TranslatableModelMixin, BaseProduct):

    # controlling the catalog
    master = models.ForeignKey(SmartCard, related_name='translations',
        null=True)
    caption = HTMLField(verbose_name=_("Caption"),
        configuration='CKEDITOR_SETTINGS_CAPTION',
        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."))

    class Meta:
        unique_together = [('language_code', 'master')]

В сравнении с простой моделью Smart Card, поле "Описание" может сейчас принимать текст в различных языках.

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

4.3. Переводимая модель в Django Admin

admin требует только незначительных изменений. Его класс должен наследоваться от TranslatableAdmin. Он добавляет вкладку для каждого настраиваемого языка вверху редактора карточки товара. Поэтому рекомендуется сгруппировать всего мультиязычные поля в один набор полей (fieldset), чтобы подчеркнуть какие поля переводятся.

myshop/admin/i18n_smartcard.py

from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from adminsortable2.admin import SortableAdminMixin
from parler.admin import TranslatableAdmin
from shop.admin.product import CMSPageAsCategoryMixin, ProductImageInline
from myshop.models import SmartCard

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

Расширить наш вариационный тип продукта (продукт с вариантами) для полиморфных моделей, которые могут поддерживать различные типы продукта описано в разделе: Продукты с разными свойствами (Products with Different Properties).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отправить

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

Попробуйте

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