Перевод полей модели

Давайте добавим переводы для нашего каталога товаров. django-parler предоставляет класс модели TranslatedModel и TranslatedFields - оболочку для преобразования полей модели. Отредактируйте файл models.py в каталоге приложения shop и добавьте следующий импорт:

from parler.models import TranslatableModel, TranslatedFields

Затем измените модель Category, чтобы перевести поля name и slug:

class Category(TranslatableModel):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=True)
    translations = TranslatedFields(
        name=models.CharField(max_length=200, db_index=True),
        slug=models.SlugField(max_length=200, db_index=True, unique=True)
    )

Модель Category наследуется теперь от TranslatedModel вместо models.Model, поля name и slug включены в TranslatedFields.

Измените модель Product, чтобы добавить переводы для полей name, slug, и description. Также оставьте непереведенные поля на данный момент:

class Product(TranslatableModel):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    description = models.TextField(blank=True)
    translations = TranslatedFields(
        name=models.CharField(max_length=200, db_index=True),
        slug=models.SlugField(max_length=200, db_index=True),
        description=models.TextField(blank=True)
    )
    category = models.ForeignKey(Category, related_name='products')
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

django-parler генерирует новую модель для каждой переводимой модели. На следующем изображении можно увидеть поля модели Product, и поля сгенерированные моделью ProductTranslation:

Модель ProductTranslation, созданная с помощью django-parler, включает поля name, slug, и description, поле language_code и ForeignKey для основного объекта Product. Связь "один ко многим" от Product до ProductTranslation. Объект ProductTranslation будет существовать для каждого из доступных языков каждого объекта Product.

Поскольку Джанго использует отдельную таблицу для перевода, есть некоторые функции, которые мы не можем использовать. Невозможно использовать упорядочение по умолчанию в преобразованном поле. Можно фильтровать по переводимым полям в запросах, но нельзя включить переведенное поле в параметрах ordering Meta. Отредактируйте файл models.py приложения shop и закомментируйте атрибут упорядочивания класса Category Meta:

class Meta:
    # ordering = ('name',)
    verbose_name = 'category'
    verbose_name_plural = 'categories'

Мы также должны закомментировать атрибут index_together класса Product Meta, поскольку текущая версия django-parler не обеспечивает поддержку его проверки. Отредактируйте класс Product Meta:

class Meta:
    ordering = ('-created',)
    # index_together = (('id', 'slug'),)

Вы можете прочитать дополнительные сведения о совместимости django-parler с Джанго здесь: http://django-parler.readthedocs.org/en/latest/compatibility.html

results matching ""

    No results matching ""