2016-04-13 11 views
5

Dlaczego otrzymuję ten wyjątek?AppRegistryNotReady: lazy format_html()?

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. 

Zdarza się tylko wtedy, gdy wywołuję unittest za pośrednictwem PyCharm, a nie jeśli używam py.test na powłoce.

Domyślam się, że reverse_lazy() nie jest tutaj leniwy, ponieważ jest używany w format_html(). Jakikolwiek sposób na leniwy format_html()?

Wersje:

  • Django 1.8
  • pycharm 5.0.4
+0

pewny, ale podejrzewam, że nie może być pycharm nazywając Django testowy zawodnik prawidłowo. Django potrzebuje kilku rzeczy, aby testy przebiegły poprawnie, trzeba załadować modele, przeanalizować wzorce URL itp. Z tego powodu Django używa polecenia zarządzania 'test manage.py' do uruchamiania testów. Możliwe, że PyCharm nie jest tego świadomy. –

+0

Czy otrzymujesz dokładnie ten sam błąd, jeśli uruchamiasz serwer programistyczny za pośrednictwem PyCharm? – alecxe

+0

Również jakich wersji PyCharm i Django używasz? Dzięki. – alecxe

Odpowiedz

1

Ponieważ są rzeczy takie jak url_patterns w stosie stacków, zakładam, że DJANGO_SETTINGS_MODULE jest ustawiony poprawnie.

Przed uruchomieniem czegokolwiek innego należy jednak zadzwonić pod numer django.setup().

import django 
django.setup() 

Dla mnie ten komunikat o błędzie zniknął.

0

Miałem pewne problemy z używaniem pycharm, ja, a ja zakładam, że używasz społeczność edycja (której używałem).

Jeśli tak, najprawdopodobniej problem nie został poprawnie skonfigurowany dla django. Prawdopodobnie możesz to naprawić za pomocą niektórych hacków, które mogą w tym pomóc.

bym zacząć od this. (importującego Django aby zapewnić konsolę django jest prowadzony)

Wtedy może this.

Jest też tak: Check „Edytuj Konfiguracje” w ramach testu jesteś działa i dodaje DJANGO_SETTINGS_MODULE=<app-name-here>.settings do zmiennych środowiskowych.

0

Jeśli wszystko powyższe zawiedzie, spróbuj inicjalizacji formularza i robi import w konstruktorze:

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) 

Błąd może być spowodowany przez dokładnym import sekwencji wykonywanych przez różne testowych biegaczy i tym fakt, że używasz tylko zmiennych klasy do dostosowania formularza.