【问题标题】:AppRegistryNotReady: lazy format_html()?AppRegistryNotReady:懒惰的 format_html()?
【发布时间】:2016-04-13 14:52:04
【问题描述】:

为什么会出现这个异常?

Traceback (most recent call last):
  File "/path1/myapp-isu/myapp_isu/tests/unit/views/test_view_isu.py", line 8, in <module>
    from myapp_isu.search_form import ISUSearchForm
  File "/path1/myapp-isu/myapp_isu/search_form.py", line 87, in <module>
    class ISUSearchForm(forms.Form):
  File "/path1/myapp-isu/myapp_isu/search_form.py", line 108, in ISUSearchForm
    foo_filter=forms.ModelChoiceField(FooFilter.objects.all(), label=format_html('<a href="%s">%s</a>', reverse_lazy('foo-filter'), FooFilter._meta.verbose_name))
  File "/path1/dt/dt/utils/templateutils.py", line 127, in reverse
    return urlresolvers.reverse(*args, **kwargs)
  File "/path1/dt/dt/utils/urlresolverutils.py", line 49, in patched_reverse
    base_url = orig_reverse(viewname, urlconf=urlconf, args=args, kwargs=kwargs, prefix=prefix, current_app=current_app)
  File "/path2/django/core/urlresolvers.py", line 578, in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
  File "/path2/django/core/urlresolvers.py", line 432, in _reverse_with_prefix
    self._populate()
  File "/path2/django/core/urlresolvers.py", line 284, in _populate
    for pattern in reversed(self.url_patterns):
  File "/path2/django/core/urlresolvers.py", line 401, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/path2/django/core/urlresolvers.py", line 395, in urlconf_module
    self._urlconf_module = import_module(self.urlconf_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/path1/myapp-eins/myapp_eins/etc/rooturls.py", line 13, in <module>
    admin.autodiscover()
  File "/path2/django/contrib/admin/__init__.py", line 24, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "/path2/django/utils/module_loading.py", line 67, in autodiscover_modules
    for app_config in apps.get_app_configs():
  File "/path2/django/apps/registry.py", line 137, in get_app_configs
    self.check_apps_ready()
  File "/path2/django/apps/registry.py", line 124, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

只有在我通过 PyCharm 调用 unittest 时才会发生这种情况,而不是在我在 shell 上使用 py.test 时发生。

我猜reverse_lazy() 在这里并不懒惰,因为它被用于format_html()。有什么办法可以偷懒format_html()

版本:

  • Django 1.8
  • Pycharm 5.0.4

【问题讨论】:

  • 不确定,但我怀疑 PyCharm 可能没有正确调用 Django 测试运行程序。 Django 需要做很多事情才能使测试正常运行,需要加载模型、解析 URL 模式等。因此,Django 使用管理命令 manage.py test 来运行测试。 PyCharm 可能没有意识到这一点。
  • 如果你通过 PyCharm 运行开发服务器,你会得到同样的错误吗?
  • 另外你使用的是什么 PyCharm 和 Django 版本?谢谢。
  • @alecxe 我在问题中添加了版本信息。

标签: django


【解决方案1】:

由于堆栈跟踪中有 url_patterns 之类的东西,我假设 DJANGO_SETTINGS_MODULE 设置正确。

但是,在运行其他任何操作之前,您仍然需要调用 django.setup()

import django
django.setup()

对我来说,这让这个错误消息消失了。

【讨论】:

    【解决方案2】:

    我自己在使用 PyCharm 时遇到了一些问题,我假设您使用的是社区版(我一直在使用)。

    如果是这样,问题很可能是您没有为 django 正确配置。您可能可以通过一些可能适用于此的技巧来解决此问题。

    我会从this. 开始 (导入 django 确保 django 控制台运行)

    那么也许this.

    还有这个: 勾选你正在运行的测试下的“Edit Configurations”,并将DJANGO_SETTINGS_MODULE=&lt;app-name-here&gt;.settings添加到环境变量中。

    【讨论】:

      【解决方案3】:

      如果以上所有方法都失败,请尝试初始化表单并在构造函数中进行导入:

          class ISUSearchForm(...):
      
          ...
      
          foo_filter = forms.Field()
      
          ...
      
          def __init__(*args, **kwargs)
      
            from ... import reverse_lazy
            from ... import FooFilter
      
            self.fields['foo_filter'] = \
              forms.ModelChoiceField(
                FooFilter.objects.all(),
                label=format_html(
                  '<a href="%s">%s</a>',
                  reverse_lazy('foo-filter'),
                  FooFilter._meta.verbose_name
                )
              )
      
            super().__init__(*args, **kwargs)
      

      错误可能是由不同的测试运行器执行的确切import序列以及您仅使用类变量来自定义表单的事实引起的。

      【讨论】:

        【解决方案4】:

        在 django 1.8 中,reverse() 和 reverse_lazy() 现在返回 Unicode 字符串而不是字节字符串。

        请参考链接:

        https://docs.djangoproject.com/en/1.8/releases/1.8/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-06
          • 2011-07-16
          • 1970-01-01
          • 2022-01-09
          • 2012-06-02
          • 2015-09-06
          相关资源
          最近更新 更多