Делаем существующие поля переводимыми (Джанго)

Я пытаюсь перевести уже существующие поля в модельный класс. Я застрял на самом первом шаге, который является подклассом TranslatableModel класс в Categoryи добавление TranslatedFields оболочка для перевода выбранных полей модели. Я следую книге "Django by Example", а также инструкциям django-parler, как это сделать, однако я получаю следующую ошибку:

File ..../env/lib/python3.5/site-packages/parler/models.py", line 965, in contribute_translations
raise TypeError("The model '{0}' already has a field named '{1}'".format(shared_model.__name__, name))
TypeError: The model 'Category' already has a field named 'name'

перед применением django-parler:

# models.py
class Category(models.Model):
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            unique=True)
    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('shop:product_list_by_category',
                       args=[self.slug])

после применения django-parler:

# models.py
class Category(TranslatableModel):
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            unique=True)
    translations = TranslatedFields(
        name = models.CharField(max_length=200,
                                db_index=True),
        slug = models.SlugField(max_length=200,
                                unique=True),
    )
    class Meta:
        # ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('shop:product_list_by_category',
                       args=[self.slug])

2 ответа

Хорошо, судя по вашему коду, вы пытаетесь следовать "Django by Example" Антонио Меле.... У меня была такая же проблема. Исправление для меня состояло в том, чтобы префикс всех полей в исходной модели с подчеркиванием, так что...

name = models.CharField (max_length = 200, db_index = True)... СТАНОВИТСЯ _name = models.CharField(max_length=200,db_index=True)

Кроме того, небольшое исследование показало, что с Django 1.9 импорт переименован. ReverseSingleRelatedObjectDescriptor согласно https://github.com/django-json-api/django-rest-framework-json-api/issues/176

Я изменил ссылку на импорт и одну другую условную инструкцию (строка 782) с 'ReverseSingleRelatedObjectDescriptor' на 'ForwardManyToOneDescriptor' в следующем файле "/Django/local/lib/python2.7/site-packages/parler/models.py".. Но я не уверен, что последний шаг действительно необходим, я думаю, что переименование достаточно?? Удачи.....

Несмотря на то, что вопрос старый, я хотел бы внести свой вклад. Пожалуйста, ваш фрагмент кода после добавления django-parler должен выглядеть так:

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

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

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('shop:product_list_by_category',
                   args=[self.slug])
Другие вопросы по тегам