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).
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0