Skip to main content
 首页 » 编程设计

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

2024年11月01日20JustinYoung

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

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

例如,我有以下模型:

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

还有下面的translation.py文件

class MyModelOptions(TranslationOptions): 
   fields = ('name',) 
 
translator.register(MyModel, MyModelOptions) 

还有两种语言,fr 和 en,在我的 settings.py 中定义

如果我在此应用程序上运行 south schemamigration,south 会将 name_fr 和 name_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 中定义的语言是什么。

您会推荐什么来解决这个问题?

请您参考如下方法:

老实说,我根本不会将这些迁移添加到包中,不应该将固定装置强加给第 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', 
} 

确保在 manage.py 中的导入语句之后添加以下行,以确保您使用的是本地可重用应用程序,而不是站点包中的(已安装)应用程序

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