2013-03-21 4 views
2

Я изучаю троицу Python/Django/MySQL для разработки сайта электронной коммерции, используя в основном Eclipse. Я видел проблему, которую я собираюсь описать, спросив о 100 разных способах как для StackOverflow, так и для интернета за рубежом, но, похоже, каждая проблема уникальна, что каждое решение не работает для меня.ImportError: Нет модуля с именем _______

В затмении, я использую некоторые простые операторы импорта в начале файла с именем forms.py импортировать некоторые Джанго формы и мой личный «Продукт» класс, например, так:

from django import forms 
from ecomstore.catalog.models import Product 

И уже возникла проблема: Eclipse показывает предупреждение «Неразрешенный импорт: Продукт» в строке, ссылаясь на «Продукт». Когда я бегу:

python manage.py validate 

в командной строке, я получаю титульной ошибку: «ImportError: Нет модуль с именем каталога,» но я назвал его _, потому что эта ошибка появляющаяся на все мои импорта из мой каталог «модуль».

Теперь я определенно новичок в области Python, поэтому я предполагаю, что у меня нет чего-то очевидного. В eclipse я, конечно, установил, что основным каталогом «ecomstore» является источник проекта, который, как я понимаю, добавляет «ecomstore» к PYTHONPATH, что позволяет мне ссылаться на элементы внутри. Соответствующая структура каталогов, для дополнительной иллюстрации точки:

-ecomstore
---- + manage.py
---- некоторые другие каталоги
---- Каталог
--- ---- + models.py
------- + forms.py < --active файл вызов для импорта
---- ecomstore < --actual папки проекта, содержит настройки .py и т. д.
------- + settings.py

Извините за мою терминологию быть выключен, я до сих пор переходит из более чем Java, и это занимает некоторое время, чтобы узнать жаргон.

Я указываю, что моя «папка проекта» имеет то же имя, что и корневая папка проекта, потому что я видел несколько проблем, связанных с каталогами с одинаковым именем, но даже после того, как я изменил каталог корневого уровня на «test , «импорт все еще терпел неудачу, поэтому я исключил его, но, возможно, я ошибся. Также обратите внимание, что form.py находится в том же каталоге, что и models.py, который является файлом, который содержит мой класс «Product» ... это не значит, что даже если моя настройка исходной папки в Eclipse не добавилась сам по себе PYTHONPATH, импорт должен STILL работать, потому что Python попытается загрузить из каталога «», например, тот, из которого вызывается импорт? Я уверен, что моя логика где-то испорчена, и поэтому я прошу о помощи.

В случае, если это поможет, вот содержание содержимого models.py, потому что, возможно, проблема в моей настройке этого файла, хотя, как я уже сказал, эта проблема возникает в нескольких местах по всему проекту, хотя ТОЛЬКО с импортом из «каталога»."

class Product(models.Model): 
name = models.CharField(max_length=50) 
slug = models.SlugField(max_length=50, 
         unique=True, 
         help_text='Unique value for product page URL, created from name.') 
brand = models.CharField(max_length=50) 
sku = models.CharField(max_length=50) 
price = models.DecimalField(max_digits=9, 
          decimal_places=2,) 
old_price = models.DecimalField(max_digits=9, 
           decimal_places=2, 
           blank=True,default=0.00) 
image = models.CharField(max_length=50) 
description = models.TextField() 
is_active = models.BooleanField(default=True) 
is_bestseller = models.BooleanField(default=False) 
is_featured = models.BooleanField(default=False) 
meta_keywords = models.CharField("Meta Keywords", 
           max_length=255, 
           help_text='Comma-delimited set of SEO keywords for meta tag') 
meta_description = models.CharField("Meta Description", 
            max_length=255, 
            help_text='Content for description meta tag') 
created_at = models.DateTimeField(auto_now_add=True) 
updated_at = models.DateTimeField(Auto_now=True) 
categories = models.ManyToManyField(Category) 

class Meta: 
    db_table = 'products' 
    ordering = ['-created_at'] 

def __unicode__(self): 
    return self.name 

@models.permalink 
def get_absolute_url(self): 
    return ('catalog_product',(), { 'product_slug': self.slug }) 

def sale_price(self): 
    if self.old_price > self.price: 
     return self.price 
    else: 
     return None 

EDIT 1
Я забыл упомянуть, я попытался удалить„ecomstore“от„ecomstore.catalog.models“, но, в то время как излечивает ошибку Eclipse, ошибка проверки остается тем же самым.

EDIT 2
я открыл командную строку и распечатать мой sys.path посмотреть, что там нормально обычным C:. \ python27 вещи были там, но ничего не ссылается ecomstore ... Я предположил, управлять .db добавлял его для меня, поскольку книга, которую я использую, никогда не говорила я имею дело с sys.path ... это, возможно, моя ошибка? Как точно знать «python manage.db validate» знать в моей корневой папке ecomstore? Возможно, в силу его местоположения в корневой папке?

EDIT 3
Где-то во всем этом пустячный пытается решить эту проблему, сам сервер был полностью пойманы на «ImportError: Нет модуль с именем каталога.» Теперь, если я попытаюсь сделать НИЧЕГО - даже до runserver, он выдает ошибку.

EDIT 4
Ниже мой manage.py, расположенный в моем корневом каталоге ecomstore. Я оставил его неотредактированным, так как он был создан django, но я полагаю, что добавлю его, если, возможно, что-то необычное для моей установки django.

#!/usr/bin/env python 
import os 
import sys 

if __name__ == "__main__": 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ecomstore.settings") 

    from django.core.management import execute_from_command_line 

    execute_from_command_line(sys.argv) 

И теперь, длинные settings.py, которые я, конечно, редактировал, работая над проектом. Это находится в каталоге ecomstore в пределах корневой директории ecomstore проекта (см выше карту каталога, в котором я сейчас, добавив к settings.py файл.

# Django settings for ecomstore project. 

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

ADMINS = (
    # ('Your Name', '[email protected]'), 
) 

MANAGERS = ADMINS 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 
     'NAME': 'ecomstore',      # Or path to database file if using sqlite3. 
     ### EDITED OUT USER CREDENTIALS FOR STACK OVERFLOW ### 
     'HOST': '',      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 
     'PORT': '',      # Set to empty string for default. 
    } 
} 

import os 
#hack to accommodate Windows 
CURRENT_PATH = os.path.abspath(os.path.dirname(__file__).decode('utf-8')).replace('\\', '/') 

# Hosts/domain names that are valid for this site; required if DEBUG is False 
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts 
ALLOWED_HOSTS = [] 

# Local time zone for this installation. Choices can be found here: 
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 
# although not all choices may be available on all operating systems. 
# In a Windows environment this must be set to your system time zone. 
TIME_ZONE = 'America/Chicago' 

# Language code for this installation. All choices can be found here: 
# http://www.i18nguy.com/unicode/language-identifiers.html 
LANGUAGE_CODE = 'en-us' 

SITE_ID = 1 

# If you set this to False, Django will make some optimizations so as not 
# to load the internationalization machinery. 
USE_I18N = True 

# If you set this to False, Django will not format dates, numbers and 
# calendars according to the current locale. 
USE_L10N = True 

# If you set this to False, Django will not use timezone-aware datetimes. 
USE_TZ = True 

# Absolute filesystem path to the directory that will hold user-uploaded files. 
# Example: "/var/www/example.com/media/" 
MEDIA_ROOT = '' 

# URL that handles the media served from MEDIA_ROOT. Make sure to use a 
# trailing slash. 
# Examples: "http://example.com/media/", "http://media.example.com/" 
MEDIA_URL = '' 

# Absolute path to the directory static files should be collected to. 
# Don't put anything in this directory yourself; store your static files 
# in apps' "static/" subdirectories and in STATICFILES_DIRS. 
# Example: "/var/www/example.com/static/" 
STATIC_ROOT = '' 

# URL prefix for static files. 
# Example: "http://example.com/static/", "http://static.example.com/" 
STATIC_URL = '/static/' 

# Additional locations of static files 
STATICFILES_DIRS = (
    os.path.join(CURRENT_PATH, 'static'), 
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

# List of finder classes that know how to find static files in 
# various locations. 
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
# 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

# Make this unique, and don't share it with anybody. 
# Naturally, edited this out for Stack Overflow as well, never edited it though anyways. 

# List of callables that know how to import templates from various sources. 
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
#  'django.template.loaders.eggs.Loader', 
) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

ROOT_URLCONF = 'ecomstore.urls' 

# Python dotted path to the WSGI application used by Django's runserver. 
WSGI_APPLICATION = 'ecomstore.wsgi.application' 

TEMPLATE_DIRS = (
    os.path.join(CURRENT_PATH, 'templates'), 
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'ecomstore.catalog', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    'catalog', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
) 

# A sample logging configuration. The only tangible logging 
# performed by this configuration is to send an email to 
# the site admins on every HTTP 500 error when DEBUG=False. 
# See http://docs.djangoproject.com/en/dev/topics/logging for 
# more details on how to customize your logging configuration. 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 

Я считаю, что у меня есть только отредактированные TEMPLATE_DIRS, STATICFILES_DIRS, и INSTALLED_APPS в этот момент, как и должно быть совершенно очевидно для всех, но здесь все это, тем не менее.

EDIT 5
я решил по крайней мере часть проблемы, и изолировали проблему. удаляя как ecomstore.catalog и catalog от моего INSTALLED_APPS, мне удалось получить человека age.py. Однако, добавив любой из этих itesm обратно в INSTALLED_APPS, возникают другие проблемы. При повторной установке ecomstore.catalog я получаю ImportError: No module named catalog. Если я вместо этого использовать catalog, я получаю эту ошибку: TypeError: __init__() got an unexpected keyowrd argument 'Auto_now'.

Кроме того, см ниже моей sys.path, который будучи новичком я, я, возможно, неумело при установке все это в первую очередь.

>>> print sys.path 
['C:\\Users\\Sean\\Dropbox\\Website\\ecomstore', 
'C:\\Python27\\lib\\site-packages\\distribute-0.6.35-py2.7.egg',  
'C:\\Python27\\lib\\site-packages\\django_db_log-2.2.1-py2.7.egg', 
'C:\\Windows\\system32\\python27.zip', 
'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 
'C:\\Python27\\lib\\plat-win', 
'C:\\Python27\\lib\\lib-tk', 
'C:\\Python27', 
'C:\\Users\\Sean\\AppData\\Roaming\\Python\\Python27\\site-packages', 
'C:\\Python27\\lib\\site-packages', 
'C:\\Python27\\lib\\site-packages\\win32', 
'C:\\Python27\\lib\\site-packages\\win32\\lib', 
'C:\\Python27\\lib\\site-packages\\Pythonwin'] 
+0

Вы включили файл '__init __. Py' в каждый подкаталог вашего проекта? – PepperoniPizza

+0

Я только дважды проверял, возможно, в четвертый раз, но да, все мои __init __. Py's находятся там, где они должны быть, и они полностью свободны от пробелов/разрывов строк/etc. – fildred13

+0

Возможно, вам потребуется проверить, установлен ли PATH ** manage.py **, я думаю, вы переместили manage.py внутри папки, которая может вызвать эту ошибку. – PepperoniPizza

ответ

1

При импорте не обязательно включать .Вы добавили catalog в свой INSTALLED_APPS в свой settings.py в папке проекта ecomstore?

т.д .:

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
    'catalog' 
) 
+0

У меня не было. Чтобы быть ясным: я добавил «каталог» к моим установленным приложениям, как вы показали, но я добавил конечную запятую в конце (вам это нужно, правильно?), А затем я изменил импорт на «from models import Product». К сожалению, при проверке все равно получается тот же ImportError. – fildred13

+0

Последний вариант является необязательным, но вы можете его добавить. Импорт все равно должен быть 'from catalog.models import Product' – Ric

+0

Я только что попробовал' from catalog.models import Product ', но ошибка сохраняется. – fildred13

0

Изменение линии

from catalog.models import Product 

и он должен работать. Проблема в том, что он ищет модуль (каталог) с именем «ecomstore» в каталогах на пути поиска. Обратите внимание, что это отличается от поиска «ecomstore» в пути поиска - ему все равно, что имена каталогов на пути поиска, они просто просматривают их.

+0

Прошу прощения, я забыл упомянуть об этом, когда задал вопрос: я действительно попытался удалить ecomstore с самого начала. Интересно, что он решает ошибку в Eclipse - исправлена ​​«проблема неразрешенных импортных», но «проверка python manage.py» все равно получается тот же ответ: ImportError: нет модуля с именем catalog – fildred13

+0

Где вы вызываете 'python manage.py validate 'от? То есть, где находится файл manage.py? Eclipse не будет устанавливать вашу систему 'PYTHONPATH', только тот, который используется в среде IDE. Попробуйте вручную установить PYTHONPATH - вы можете сделать это в окне переменных среды, где-то в ваших системных настройках Windows. – lxop

+0

Я вызываю его из корневого каталога ecomstore. Я отредактирую главный пост за минуту, чтобы показать его местоположение. Что касается второй части вашего вопроса ... извините мое невежество, но что именно я устанавливаю в PYTHONPATH? Корневой каталог ecomstore? – fildred13

0

Выстрел в темноте: Проверьте настройки PYTHONPATH в системных настройках Windows. Это был щелчок правой кнопкой мыши по значку «Мой компьютер» и нажмите «Свойства». Одна из вкладок покажет вам sistem пути.

+0

В соответствии с комментариями к самому вопросу, я сначала попытался добавить каталог «ecomstore» в путь python, а затем, когда это не удалось, я очистил модификации, чтобы воссоздать чистый сланец. – fildred13

Смежные вопросы