【问题标题】:modeltranslation app doesn't add translated fields in modelsmodeltranslation 应用程序不会在模型中添加已翻译的字段
【发布时间】:2012-12-30 23:30:46
【问题描述】:

我是模型翻译的新手,但遇到了问题。当我在创建模型并注册要在 translation.py 中翻译的字段后执行 manage.py syncdb 命令时,模型翻译应用程序不会将翻译后的字段添加到模型中。这些字段在表中。因此,如果我在 python shell 中创建一个对象,我将无法访问display_en,因为它会引发错误

AttributeError: 'Content' object has no attribute 'display_en'

我的 settings.py :

    DEBUG = True
    TEMPLATE_DEBUG = DEBUG

    ADMINS = (
         # ('Your Name', 'your_email@example.com'),
    )

    MANAGERS = ADMINS

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': 'test_db',                      # Or path to database file if using sqlite3.
            'USER': 'postgres',                      # Not used with sqlite3.
            'PASSWORD': 'admin',                  # Not used with sqlite3.
            'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
            'PORT': '5432',                      # Set to empty string for default. Not used with sqlite3.
          }
     }


     SITE_ID = 1

     TIME_ZONE = 'UTC'
     LANGUAGE_CODE = 'fr-fr'

     ugettext = lambda s: s

     LANGUAGES = ( 
          ('fr', ugettext('French')),
          ('en', ugettext('English')),
          ('ja', ugettext('Japanese')),
     )


     USE_I18N = True


     TEMPLATE_CONTEXT_PROCESSORS = (
     'django.core.context_processors.auth',
     'django.core.context_processors.debug',
     'django.core.context_processors.i18n',
     )

     USE_L10N = True
     USE_TZ = True

     STATICFILES_FINDERS = (
       'django.contrib.staticfiles.finders.FileSystemFinder',
       'django.contrib.staticfiles.finders.AppDirectoriesFinder',
       # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
    )

   # List of callables that know how to import templates from various sources.
   TEMPLATE_LOADERS = (
        'django.template.loaders.filesystem.Loader',
        'django.template.loaders.app_directories.Loader',
    )

   MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
   )

   ROOT_URLCONF = 'mysite.urls'


   TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
  )

   INSTALLED_APPS = (
       'django.contrib.auth',
       'django.contrib.contenttypes',
       'django.contrib.sessions',
       'django.contrib.sites',
       'django.contrib.messages',
       'django.contrib.staticfiles',
       'tagging',
       #'social_auth',
       'south',
       'django.contrib.admin',
       'sorl.thumbnail',
       'modeltranslation',
       'myapp',
       # Uncomment the next line to enable admin documentation:
       # 'django.contrib.admindocs',
     )

     TRANSLATION_REGISTRY = "myapp.translation" 

我的models.py:

    from django.db import models
    from django.utils.translation import ugettext_lazy as _
    from django.conf import settings

    class Test(models.Model):
        display = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('test.display'))
        url = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('test.url'))

我的翻译.py:

    from modeltranslation.translator import translator, TranslationOptions

    from myapp.models import Test


    class TestTranslationOptions(TranslationOptions):
        fields = ('display')

    translator.register(Test, TestTranslationOptions)

【问题讨论】:

    标签: django django-models django-modeltranslation


    【解决方案1】:

    模型翻译是否加载?使用开发服务器manage.py runserver 将调试信息打印到stdout

    Validating models...
    
    modeltranslation: Registered 2 models for translation (Foo, Bar) [pid:12345].
    0 errors found
    [...]
    

    如果你没有看到这个(并且你没有停用DEBUG),我想在导入时出了点问题。

    还有你用的是哪个modeltranslation 版本?

    TRANSLATION_REGISTRY 设置自 0.3 起已弃用,它切换到一致的前缀,因此它变为 MODELTRANSLATION_TRANSLATION_REGISTRY

    在 0.4 中引入了每个应用级别的翻译文件,使此设置完全可选。相反,现在每个应用程序都会在其根目录中自动搜索translation.py。同时添加了MODELTRANSLATION_TRANSLATION_FILES。它也是可选的,它允许扩展翻译文件列表。

    虽然即使在最新的开发版本中也保留了对MODELTRANSLATION_TRANSLATION_REGISTRY 的支持以保持向后兼容性,但不再建议使用它。相反,只需将translation.py 放入您要翻译的应用的目录中即可。

    最后,translation.py 中的fields 属性应该是一个元组(或列表),您在其中定义一个字符串。当您添加这样的逗号时,Python 只会将其识别为元组:

    class TestTranslationOptions(TranslationOptions):
        fields = ('display',)
    

    我想这是您的问题中的一个错字,因为我希望 modeltranslation 在找不到字段时退出。

    【讨论】:

      【解决方案2】:

      您使用的是南,所以您必须执行 ./manage.py migrate 来翻译您的字段。希望对您有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-05
        • 2018-04-22
        • 1970-01-01
        • 2016-04-10
        • 2020-04-16
        • 2015-06-03
        • 2019-06-18
        • 1970-01-01
        相关资源
        最近更新 更多