2

我有一個可重用的應用程序。在這個應用程序中,有些模型需要本地化,我正在使用django-modeltranslation應用程序。如何使用django-modeltranslation正確管理可重用應用的南遷移?

使用django-modeltranslation會導致南遷移在模型定義中包含本地化字段。

例如,我我有以下型號:

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

而下面translation.py文件

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

translator.register(MyModel, MyModelOptions) 

和兩種語言,FR和連接,在我的settings.py

定義

如果我在這個應用程序上運行南模式遷移,南會將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中定義的語言。

你會推薦什麼來管理這個問題?

回答

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 import語句之後,以確保你工作的地方reusable_app不是(安裝)一個在站點包

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
相關問題