2

我有一个可重用的应用程序。在这个应用程序中,一些模型需要本地化,我正在使用 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_frandname_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'}),
    }

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

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

你会推荐什么来管理这个问题?

4

2 回答 2

1

老实说,我根本不会将这些迁移添加到包中,不应该将固定装置强加给第 3 方用户。一个不错的方法是在包中创建一个演示项目并添加适当的文档,例如(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',
}

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

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
于 2013-05-10T15:28:27.237 回答
1

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

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

于 2014-01-28T10:43:25.373 回答