Monday, April 25, 2016

AppRegistryNotReady: lazy format_html()?

Leave a Comment

Why do I get this exception?

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. 

It only happens if I call the unittest via PyCharm, not if I use py.test on the shell.

I guess reverse_lazy() is not lazy here, since it gets used in format_html(). Any way to have a lazy format_html()?

Versions:

  • Django 1.8
  • Pycharm 5.0.4

3 Answers

Answers 1

Since there are things like url_patterns in the stacktrace, I assume that DJANGO_SETTINGS_MODULE is set correctly .

But, you still need to call django.setup() before running anything else.

import django django.setup() 

For me, that made this error message go away.

Answers 2

I've had some trouble using PyCharm, myself, and I'll assume you're using the the community edition (which I've been using).

If so, the problem is very likely that you're not properly configured for django. You can probably fix this with some hacks that might work for this.

I'd start off with this. (importing django to ensure the django console is run)

Then maybe this.

There's also this: Check "Edit Configurations" under the test you're running, and add DJANGO_SETTINGS_MODULE=<app-name-here>.settings to environment variables.

Answers 3

If all of the above fails, try initializing your form and doing the import in the constructor:

    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) 

The error may be caused by the exact import sequence performed by the different test runners and the fact that you use only class variables to customize your form.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment