我有一个可重用的应用程序。在此应用中,一些模型需要本地化,我为此使用了 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__))))
