2016-01-08 8 views
2

Я перехожу от Django 1.6 до 1.7, и когда я пытаюсь сделать manage.py runserver я получаю следующий след:Обновление до Джанго 1.7: Получение AppRegistryNotReady для перевода инфраструктуры

Traceback (most recent call last): 
    File "manage.py", line 9, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line 
    utility.execute() 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute 
    django.setup() 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/__init__.py", line 21, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate 
    app_config = AppConfig.create(entry) 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/apps/config.py", line 87, in create 
    module = import_module(entry) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/home/ben/Code/Repos/myrepo/myproject/core/mail/__init__.py", line 6, in <module> 
    from myproject.core.mail.models import IMapEmailMessage, EmailStatus 
    File "/home/ben/Code/Repos/myrepo/myproject/core/mail/models.py", line 20, in <module> 
    from myproject.core.mail.utils import render_templates 
    File "/home/ben/Code/Repos/myrepo/myproject/core/mail/utils.py", line 19, in <module> 
    from myproject.core.util import clean_html 
    File "/home/ben/Code/Repos/myrepo/myproject/core/util.py", line 1031, in <module> 
    def make_url(url, text=_('here')): 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 83, in ugettext 
    return _trans.ugettext(message) 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 325, in ugettext 
    return do_translate(message, 'ugettext') 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 306, in do_translate 
    _default = translation(settings.LANGUAGE_CODE) 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 209, in translation 
    default_translation = _fetch(settings.LANGUAGE_CODE) 
    File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 189, in _fetch 
    "The translation infrastructure cannot be initialized before the " 
django.core.exceptions.AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time. 

я не использовал реестр приложений раньше, поэтому я предполагаю, что некоторые настройки должны быть выполнены в моих приложениях, прежде чем переводы могут быть использованы. Решение, которое я продолжаю видеть это, чтобы добавить это wsgi.py:

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

Однако у меня уже есть эти строки там. В файле myproject/core/util.py я изменил следующую строку:

from django.utils.translation import ugettext as _ 

к:

from django.utils.translation import ugettext_lazy as _ 

И только переместил проблему в другой файл, который используется ugettext. Нельзя ли использовать не-ленивый ugettext? Или есть какая-то настройка, которую мне нужно сделать, чтобы избежать ее оценки во время импорта?

+0

это не ответ! почему вы не хотите использовать последнюю версию? 1.9 –

+2

Я обновляю инкрементно до 1,8, но сначала пытаюсь получить работу 1.7. – benwad

+1

Я думаю, что последняя строка трассировки важна: «Убедитесь, что вы не делаете нелатные вызовы gettext во время импорта». Поэтому да, при импорте вам нужна ленивая версия – Sayse

ответ

2

Проблема с использованием make_url(url, text=ugettext('here')) является то, что аргумент по умолчанию для text оценивается , когда модуль импортируется, не тогда, когда работает функция make_url.

Вы не указали код, который сгенерировал вторую ошибку, поэтому я не знаю, что с ней было.

Хорошо использовать ugettext внутри функции (пока эта функция не будет работать во время импорта). Например:

def make_url(url, text=None): 
    if text is None: 
     text = ugettext('here') 

Примечание, вы все еще можете сделать import uggettext as _ в вашем коде, я просто использовал ugettext выше, чтобы быть явным.

+0

Спасибо! Вот и все. Мне просто нужно было изменить 'ugettext' на' ugettext_lazy', где бы я не получил эту ошибку. К счастью, было всего 2 случая; в основном 'ugettext' работал как раньше. – benwad