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

2 октября 2016 г. 9: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 из 5 (всего 0 оценок)

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

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

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

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

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

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

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

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

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

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

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

Отправить

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

Попробуйте