如何使用django-modeltranslation正确管理可重用应用程序的南迁移?

时间:2013-05-10 14:56:54

标签: python django localization django-south django-modeltranslation

我有一个可重复使用的应用程序。在这个应用程序中,一些模型需要本地化,我正在使用django-modeltranslation应用程序。

使用django-modeltranslation导致南迁移在模型定义中包含本地化字段。

例如,我有以下型号:

class MyModel(models.Model):
    name = models.CharField(...)

以下translation.py文件

class MyModelOptions(TranslationOptions):
   fields = ('name',)

translator.register(MyModel, MyModelOptions)

和我的settings.py

中定义的两种语言fr和en

如果我在此应用上运行南方模式迁移,则南方会将name_frname_en字段添加到迁移的模型定义中

class Migration(SchemaMigration):

    def forwards(self, orm):
         #Here the columns are created depending but It can be managed for all languages in settings.LANGUAGES
         for (lang, _x) in settings.LANGUAGES:
             #create the column for the language


def backwards(self, orm):
         #Simimar workaround than forwards can be implemented

models = {
    'myapp.mymodel': {
        'Meta': {'object_name': 'MyModel'},
        'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
        'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),

        #The following items are the model definition and can not be generated from settings.LANGUAGES
        'name_en': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
        'name_fr': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
    }

据我所知,这个模型定义是由南方以硬编码方式生成的。

因此,使用django-modeltranslation很难维护可重用应用程序的南迁移,因为无法预先知道项目的settings.py中定义的语言是什么。

您建议您管理此问题?

2 个答案:

答案 0 :(得分:1)

说实话,我根本不会将这些迁移添加到包中,不应该强迫第三方用户使用固定装置。一个很好的方法是在包中创建一个演示项目并添加适当的文档,例如(django 1.4 +)

repository_root/
    example/
        example/
            __init__.py
            urls.py
            settings.py
            static/
                js/
            fixtures/
                data.json
            migrations/
                reusable_app/
                    __init__.py
                    0001_initial.py
        manage.py
    reusable_app/
        models.py
        urls.py
        views.py
        admin.py

向settings.py添加一些设置以保持清洁

def rel(*x):
    return os.path.join(os.path.abspath(os.path.dirname(__file__)), *x)

FIXTURE_DIRS = (
    rel('fixtures'),
)

SOUTH_MIGRATION_MODULES = {
    'reusable_app': 'example.migrations.reusable_app',
}

确保在manage.py中的导入语句后添加以下行,以确保您正在使用本地reusable_app而不是site-packages中的(已安装)

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

答案 1 :(得分:1)

我选择的选项是在制作models translation时禁用(从INSTALLED_APPS中删除)schemamigration并让sync_translation_fields管理缺失翻译字段的创建。

这似乎是一种可接受的方法:https://github.com/deschler/django-modeltranslation/issues/106#issuecomment-33875679