0

I have a custom Category model extends the CategoryBase in django-categories.

When I put it into the haystack index and restart the server, on the first run it complains cannot import name CategoryBase which is CategoryBase cannot be imported from categories.base but if I refresh the page again the site runs fine and search result returns correct information. This seems like because of the order of the imports.

I looked at the stacktrace and found out the error originating from admin.autodiscover inside urls.py the imports looks like this in urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()           
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.views.generic import TemplateView
from django.contrib.sitemaps import GenericSitemap
from galleries.models import Gallery 
from events.models import Event
from django.contrib.auth.views import login, logout
from dajaxice.core import dajaxice_autodiscover, dajaxice_config
from core.models import StaticPageSitemap
from articles.models import ArticleSitemap, IssueSitemap
dajaxice_autodiscover()   

I have tried moving the autodiscover to after all the imports as below:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.views.generic import TemplateView
from django.contrib.sitemaps import GenericSitemap
from galleries.models import Gallery 
from events.models import Event
from django.contrib.auth.views import login, logout
from dajaxice.core import dajaxice_autodiscover, dajaxice_config
from core.models import StaticPageSitemap
from articles.models import ArticleSitemap, IssueSitemap
admin.autodiscover()
dajaxice_autodiscover()

While the error has gone away on the first run but the search does not return any result on categories.

Here is the stacktrace:

Django Version: 1.5
Python Version: 2.7.3
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.comments',
 'django.contrib.sites',
 'django.contrib.markup',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sitemaps',
 'django.contrib.sessions',
 'django.contrib.admin',
 'djcelery',
 'filebrowser',
 'compressor',
 'south',
 'taggit',
 'categories',
 'categories.editor',
 'core',
 'articles',
 'newsletters',
 'galleries',
 'events',
 'haystack',
 'dajaxice',
 'zencode',
 'videos',
 'directory',
 'dps_payment',
 'home',
 'taggit_autosuggest',
 'captcha',
 'search',
 'media_board']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  92.                     response = middleware_method(request)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/middleware/common.py" in process_request
  69.             if (not urlresolvers.is_valid_path(request.path_info, urlconf) and
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/core/urlresolvers.py" in is_valid_path
  551.         resolve(path, urlconf)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  440.     return get_resolver(urlconf).resolve(path)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  319.             for pattern in self.url_patterns:
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/core/urlresolvers.py" in url_patterns
  347.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/core/urlresolvers.py" in urlconf_module
  342.             self._urlconf_module = import_module(self.urlconf_name)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/srv/www/weddings/weddings_advanced/weddings/urls.py" in <module>
  3. admin.autodiscover()
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/contrib/admin/__init__.py" in autodiscover
  29.             import_module('%s.admin' % app)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/contrib/auth/admin.py" in <module>
  172. admin.site.register(Group, GroupAdmin)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/contrib/admin/sites.py" in register
  98.                 validate(admin_class, model)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/contrib/admin/validation.py" in validate
  22.     models.get_apps()
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/db/models/loading.py" in get_apps
  134.         self._populate()
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/db/models/loading.py" in _populate
  75.                     self.load_app(app_name)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/db/models/loading.py" in load_app
  96.             models = import_module('.models', app_name)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/srv/www/weddings/weddings_advanced/videos/models.py" in <module>
  9. from categories.models import Category
File "/srv/www/weddings/local/lib/python2.7/site-packages/categories/models.py" in <module>
  13. from .base import CategoryBase
File "/srv/www/weddings/local/lib/python2.7/site-packages/categories/base.py" in <module>
  32. class CategoryBase(MPTTModel):
File "/srv/www/weddings/local/lib/python2.7/site-packages/categories/base.py" in CategoryBase
  41.         verbose_name=_('parent'))
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/translation/__init__.py" in ugettext
  71.     return _trans.ugettext(message)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py" in ugettext
  276.         return do_translate(message, 'ugettext')
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py" in do_translate
  258.             _default = translation(settings.LANGUAGE_CODE)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py" in translation
  172.     default_translation = _fetch(settings.LANGUAGE_CODE)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py" in _fetch
  154.             app = import_module(appname)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/srv/www/weddings/local/lib/python2.7/site-packages/haystack/__init__.py" in <module>
  154. handle_registrations()
File "/srv/www/weddings/local/lib/python2.7/site-packages/haystack/__init__.py" in handle_registrations
  151.     search_sites_conf = importlib.import_module(settings.HAYSTACK_SITECONF)
File "/srv/www/weddings/local/lib/python2.7/site-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/srv/www/weddings/weddings_advanced/search/search_sites.py" in <module>
  8. from directory.models import Listing, Category as DirectoryCategory
File "/srv/www/weddings/weddings_advanced/directory/models.py" in <module>
  21. from categories.base import CategoryBase

Exception Type: ImportError at /directory/listing/new-listing-gift
Exception Value: cannot import name CategoryBase
j0k
  • 22,600
  • 28
  • 79
  • 90
James Lin
  • 25,028
  • 36
  • 133
  • 233

1 Answers1

0

Finally managed to fix it!!!!

Root cause was in from categories.models import Category in videos app, which is another app model importing the Category which extends CategoryBase, and it's causing circular reference, to fix it, in the models.py of videos app, change from direct import to lazy import as below:

categories = models.ManyToManyField('categories.Category', null=True, blank=True)

Update:

Above fix only worked very briefly and then I got other circular import problems on other models, what finally fixed it was upgrading haystack to v2.1.0

James Lin
  • 25,028
  • 36
  • 133
  • 233