views:

428

answers:

2

I'm trying to setup haystack with whoosh backend. When i try to gen the index [or any index command for that matter] i receive:

TypeError: Item in ``from list'' not a string

if i completely remove my search_indexes.py i get the same error [so i'm guessing it can't find that file at all]

what might cause this error? it's set to autodiscover and i'm sure my app is installed because i'm currently using it.

Full traceback:

    Traceback (most recent call last):
  File "./manage.py", line 17, in <module>
    execute_manager(settings)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 362, in execute_manager
    utility.execute()
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 303, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 257, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/core/management/__init__.py", line 67, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/Users/ghostrocket/Development/Redux/.dependencies/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 124, in <module>
    handle_registrations()
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 121, in handle_registrations
    search_sites_conf = __import__(settings.HAYSTACK_SITECONF)
  File "/Users/ghostrocket/Development/Redux/website/../website/search_sites.py", line 2, in <module>
    haystack.autodiscover()
  File "/Users/ghostrocket/Development/Redux/.dependencies/haystack/__init__.py", line 83, in autodiscover
    app_path = __import__(app, {}, {}, [app.split('.')[-1]]).__path__
TypeError: Item in ``from list'' not a string

and here is my search_indexes.py

from haystack import indexes
from haystack import site
from myproject.models import *

site.register(myobject)
+1  A: 

It seems like there are two problems you're running into.

The first is the one that's generating that TypeError. It occurs while Haystack is searching through each app you have listed in INSTALLED_APPS for a search_indexes.py (since you're auto-registering). I'm not sure exactly what the problem is, but I'd start by doing a search through your project for from list and double-checking your code. I haven't encountered that exception before, but if that's happening in code you wrote you should post any relevant sections in your question

I believe the reason you get the same error with or without the search_indexes.py file is because it never reaches the point of trying to execute the code in that file.

That said, there should be more happening in that file (which is the second problem). You have to create an index class (that inherits from haystack.indexes.SearchIndex) and register that with the model. See this section of the documentation for instructions and an example.

I'd also ask this question in the django-haystack Google Group since the author and other users of haystack will see it there and they tend to be extremely helpful.

John Debs
thanks! i've actually gotten it to work by bypassing search_indexes.py altogether and just putting everything in search_sites.py. I'm still trying to track down the exact issue, at which point I'll definitely post it here. Thanks again for our help!
Keith Fitzgerald
+1  A: 

I've just encountered the same TypeError message with a completely different stack.

A search on the whole error message brought up two results: this question, and the source code for Python's import.c. So after a little digging, I find that this particular error is caused when the __import__ builtin is passed an import name which isn't a string.

The important word there is string - ie. a str object. Anything else (eg. unicode) will be rejected with the error described here.

So the solution is: wherever you're passing a module/member name to something which will dynamically import it, make sure that it's a str and not a unicode.

Fails:

__import__('mylib.foo', globals(), locals(), [u'bar'])

Work:

__import__('mylib.foo', globals(), locals(), ['bar'])
__import__(u'mylib.foo', globals(), locals(), ['bar'])

Of course, this is probably only relevant to Python 2.x, given that 3.x does strings/unicode differently.

Raumkraut