rxdazn
rxdazn

Reputation: 1390

Django can't find a module when imported from urls.py

I'm having an issue importing another urlpatterns.

python manage.py shell -> from bar.urls import urlpatterns is working fine but Django doesn't find bar when I try to import it from foo/foo/urls.py : "No module named bar.urls".

tree ~/workdir/foo

foo
├── foo
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── local_db
│   │   └── foo.db
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py
├── __init__.py
├── manage.py
├── bar
│   ├── __init__.py
│   ├── models.py
│   ├── baz
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── baz_interface.py
│   │   ├── test.py
│   ├── templates
│   │   └── index.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── README.md
└── requirements.txt

5 directories, 28 files

foo/urls.py

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
        (r'^test/', include('foo.bar.urls')),
)

# this will fail too :
# 1.
# from foo.bar.urls import urlpatterns as test
# urlpatterns += test
# 2.
# from bar.urls import urlpatterns as test
# urlpatterns += test
# 3.
#urlpatterns = patterns('',
#    (r'^test/', include('bar.urls')),
#)

bar/urls.py

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
     url(r'^$', 'foo.bar.views.viewname', name='viewname'),
)

I'm running Django 1.4.3 on Python 2.7.3 in a virtualenv.
bar is in my INSTALLED_APPS.
~/workdir/foo/ is in my python path.

How can I make my urlpattern import from foo/foo/urls.py work?

Thank you.

Upvotes: 1

Views: 3691

Answers (2)

Thierry Lam
Thierry Lam

Reputation: 46284

Your bar/urls.py should look like:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('bar.views',
    url(r'^$', 'viewname', name='viewname'),
)

Your foo/urls.py is:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
    url(r'^test/', include('bar.urls')),
)

Upvotes: 4

Rustem
Rustem

Reputation: 2932

If you check you check sys.path variable after your app started, your will see that your first path in list is: foo - root directory. If I understand you right, you can may path something like

   sys.path.insert(0, '..') 

It's very bad solution, more better is:

   PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))   
   sys.path.insert(0, os.path.join(PROJECT_ROOT, '..')

Best solution is create one more foo directory above your foo's. And project as:

python foo/manage.py runserver

Upvotes: 0

Related Questions