【问题标题】:Making existing fields translatable(Django)使现有字段可翻译(Django)
【发布时间】:2017-01-07 07:32:42
【问题描述】:

我正在尝试翻译模型类上已经存在的字段。我被困在第一步,即在Category 中继承TranslatableModel 类,并添加TranslatedFields 包装器来翻译选定的模型字段。我正在关注一本书 'Django by Example' 以及 django-parler instructions 如何做到这一点,但是我收到以下错误:

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

【问题讨论】:

    标签: django django-models django-1.10 django-parler


    【解决方案1】:

    好的,从您的代码来看,您正在尝试遵循 Antonio Mele 的“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

    我在以下文件“/Django/local/lib/python2.7/site-packages/parler/models.py “.. 但是我不确定最后一步是否真的有必要,我认为重命名就足够了??祝你好运.....

    【讨论】:

      【解决方案2】:

      即使这个问题很老,我也想贡献一下。请添加 django-parler 后的代码 sn-p 应如下所示:

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

      【讨论】:

        猜你喜欢
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 2011-11-27
        • 2018-08-28
        • 2019-09-22
        • 2010-11-25
        • 1970-01-01
        • 2011-01-09
        相关资源
        最近更新 更多