在Django-Oscar中使用Django-ModelTranslation提示“未检测到新可翻译字段”
我之前在Mezzanine项目里集成Oscar后,也碰到过一模一样的问题——Mezzanine的翻译字段正常工作,但给Oscar产品加翻译时始终提示"No new translatable fields detected",给你几个亲测有效的排查和解决方向:
1. 用正确姿势注册Oscar模型的翻译
Oscar的模型是通过它自己的加载机制管理的,直接硬导入模型注册翻译可能不生效,一定要用Oscar提供的get_model()来获取原始模型实例:
from modeltranslation.translator import register, TranslationOptions from oscar.core.loading import get_model # 拿到Oscar的Product模型 Product = get_model('catalogue', 'Product') class ProductTranslationOptions(TranslationOptions): # 替换成你需要翻译的字段,比如title、description这些 fields = ('title', 'description',) # 注册翻译配置 register(Product, ProductTranslationOptions)
别去继承Oscar的模型再注册翻译,直接对原始模型操作才是正确的方式。
2. 检查INSTALLED_APPS的顺序
Modeltranslation的app必须放在所有Oscar相关app的前面,否则它没法拦截Oscar模型的初始化流程,导致检测不到字段:
INSTALLED_APPS = [ 'modeltranslation', # 先放Mezzanine的apps 'mezzanine.boot', 'mezzanine.conf', 'mezzanine.core', # 再放Oscar的apps 'oscar', 'oscar.apps.catalogue', # ... 其他项目和第三方app ]
3. 清除缓存并重新生成迁移
因为你先初始化了Mezzanine,Django的模型缓存里可能已经提前加载了Oscar的模型,导致modeltranslation没捕捉到字段变化:
- 删除项目下所有app里的迁移文件(保留
__init__.py) - 重启开发服务器,或者执行
python manage.py flush(注意:这会清空数据库,仅限测试环境使用) - 重新生成迁移:
python manage.py makemigrations,再执行python manage.py migrate
4. 确认ModelTranslation的配置完整性
检查settings.py里的modeltranslation配置是否齐全:
# 你的目标语言列表 MODELTRANSLATION_LANGUAGES = ('en', 'zh-cn') MODELTRANSLATION_DEFAULT_LANGUAGE = 'en' # 指定存放翻译注册代码的文件路径 MODELTRANSLATION_TRANSLATION_FILES = ( 'your_project.translations', # 比如你把翻译注册放在translations.py里 )
另外要确保django.middleware.locale.LocaleMiddleware在中间件列表里,并且放在CommonMiddleware之后。
5. 规避Mezzanine与ModelTranslation的加载冲突
Mezzanine自身的翻译机制可能影响Oscar模型的加载优先级,你可以把Oscar的翻译注册代码放在单独文件里,然后在项目app的ready()方法中强制导入,确保它在模型初始化前被加载:
# yourapp/apps.py from django.apps import AppConfig class YourAppConfig(AppConfig): name = 'yourapp' def ready(self): # 导入翻译注册文件 import your_project.translations
然后在settings.py里把你的app指定为这个配置类:
INSTALLED_APPS = [ # ... 'yourapp.apps.YourAppConfig', # ... ]
如果以上方法都没解决,你可以试试执行python manage.py makemigrations --verbosity 3,查看详细日志——日志里会显示modeltranslation扫描了哪些模型、哪些字段被标记为可翻译,能帮你定位具体哪里出了问题。
内容的提问来源于stack exchange,提问作者nusantara

