2

I am trying to translate already existing fields on a model class. I got stuck at the very first step, which is subclassing TranslatableModel class in Category, and adding TranslatedFields wrapper to translate selected model fields. I am following a book 'Django by Example' as well as the django-parler instructions on how to do that, however I am getting the following error:

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'

before applying 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])

after applying 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])
an0o0nym
  • 1,456
  • 16
  • 33

2 Answers2

0

Ok judging from your code you are trying to follow "Django by Example" by Antonio Mele....I had the same issue. The fix for me was to prefix all fields in the original Model with an underscore, so...

name = models.CharField(max_length=200,db_index=True)... BECOMES _name = models.CharField(max_length=200,db_index=True)

Also a bit of research showed that as of Django 1.9 there is an import renamed.. ReverseSingleRelatedObjectDescriptor as per https://github.com/django-json-api/django-rest-framework-json-api/issues/176

I changed the import and one other conditional statement reference(line 782) from 'ReverseSingleRelatedObjectDescriptor' to 'ForwardManyToOneDescriptor' in the following file "/Django/local/lib/python2.7/site-packages/parler/models.py".. But I am not sure if the last step is really necessary, I think the renaming is sufficient??Best of luck.....

Paddy Popeye
  • 1,634
  • 1
  • 16
  • 29
-1

Even though the question is old, I'd like to contribute. Please your code snippet after adding django-parler should look like this:

  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])