Я изучаю троицу 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']
Вы включили файл '__init __. Py' в каждый подкаталог вашего проекта? – PepperoniPizza
Я только дважды проверял, возможно, в четвертый раз, но да, все мои __init __. Py's находятся там, где они должны быть, и они полностью свободны от пробелов/разрывов строк/etc. – fildred13
Возможно, вам потребуется проверить, установлен ли PATH ** manage.py **, я думаю, вы переместили manage.py внутри папки, которая может вызвать эту ошибку. – PepperoniPizza