我正在尝试使用Django-ModelTranslation(0.12.2)为Django-Oscar(1.5.2)中的产品提供翻译字段。它使用Django 1.10.8。我按照Registering Models for Translation上的文档进行了操作,但不断回复:No new translatable fields detected
。
我不知道这是否可能是问题的一部分,但我首先启动了Mezzanine(4.2.3)项目,然后使用Oscar的docs将Oscar整合到其中。翻译领域完美地添加到Mezzanine。 (编辑:将Oscar与ModelTranslation一起添加到一个新的Django项目,同样的响应,所以它不是Mezzanine。)
下面,我将展示如何将Oscar的目录应用程序分叉并添加到settings.py。
项目/ settings.py:
from oscar import get_core_apps
# Django-ModelTranslation settings
USE_MODELTRANSLATION = True
MODELTRANSLATION_FALLBACK_LANGUAGES = ('en',)
LANGUAGES = (
('en', _('English')),
('de', _('German')),
)
INSTALLED_APPS = [
...,
] + get_core_apps(['forked_apps.catalogue'])
项目/ forked_apps /目录/ translation.py:
from modeltranslation.translator import translator, TranslationOptions
from oscar.apps.catalogue.abstract_models import AbstractProduct
class AbstractProductTranslationOptions(TranslationOptions):
fields = ('title', 'description',)
translator.register(AbstractProduct, AbstractProductTranslationOptions)
然后我跑sync_translation_fields
无济于事。我错过了什么?
答案 0 :(得分:3)
所以,我在PyCharm上按了CTRL + SHIFT + R,输入了No new translatable fields detected
响应并搜索了ModelTranslation包中的来源。我在modeltranslation.management.commands.sync_translation_fields.Command中找到了它。这是一个包含handle()的类,其中包含以下行:models = translator.get_registered_models(abstract=False)
。
我想,好吧,也许它不起作用,因为oscar.apps.catalogue.abstract_models.AbstractProduct有abstract=True
。我猜死亡的赠品是以模块本身的名义。
那么,如果它不是AbstractProduct,哪里是正确的模型?我决定尝试触发另一个错误来解决它。我在project.catalogue.abstract_models中用我自己的东西覆盖了奥斯卡的abstract_models.AbstractProduct:
from django.db import models
from django.utils.translation import get_language, pgettext_lazy
from django.utils.translation import ugettext_lazy as _
from oscar.apps.catalogue.abstract_models import AbstractProduct
class AbstractProduct(AbstractProduct):
title = models.CharField(pgettext_lazy(u'Product title', u'Title'),
max_length=255, blank=True)
description = models.TextField(_('Description'), blank=True)
from oscar.apps.catalogue.models import *
它产生了这个错误:
ERRORS:
catalogue.AbstractProduct.product_class: (fields.E304) Reverse accessor for 'AbstractProduct.product_class' clashes with reverse accessor for 'Product.product_class'.
...
它持续超过20行,但第一行就足够了。正确的型号是Product。所以,我再去打猎,并在oscar.apps.catalogue.models.Product中找到它。毫不奇怪,它看起来像这样:Product(AbstractProduct)
。
还有两件事要做。首先,我在project.forked_apps.catalogue:
中编辑了我的translation.pyfrom modeltranslation.translator import register, translator, TranslationOptions
# DELETED: from oscar.apps.catalogue.abstract_models import AbstractProduct
from oscar.apps.catalogue.models import Product
# Updated the following accordingly.
class ProductTranslationOptions(TranslationOptions):
fields = ('title', 'description',)
translator.register(Product, ProductTranslationOptions)
其次,我跑了python manage.py sync_translation_fields
。它奏效了!
现在,无论下一个问题是什么。