私はPython/Django / MySQLの三位一体を学び、主にEclipseを使用してeコマースサイトを開発しています。これから説明する問題は、StackOverflowと海外のインターネットの両方で約100の異なる方法で尋ねられたのを見てきましたが、すべての問題は十分に固有であり、各ソリューションが機能しないようです。
Eclipseでは、 forms.pyというファイルの先頭にあるいくつかの単純なインポートステートメントを使用して、次のようにいくつかのdjangoフォームと個人の「Product」クラスをインポートしています。
from django import forms
from ecomstore.catalog.models import Product
そして、すでに問題が発生しています。Eclipseは、「Product」を参照して、「Unresolved import:Product」警告を行に表示しています。私が走るとき:
python manage.py validate
コマンドラインで、「ImportError:カタログという名前のモジュールがありません」というタイトルのエラーが表示されますが、このエラーがカタログ「モジュール」からのすべてのインポートで発生しているため、_という名前を付けました。
今、私は間違いなくPythonの分野の初心者なので、明らかな何かが欠けていると思います。Eclipseでは、もちろんメインの「ecomstore」ディレクトリをプロジェクトソースに設定しました。これにより、「ecomstore」がPYTHONPATHに追加され、内部のアイテムを参照できるようになります。ポイントをさらに説明するための関連するディレクトリ構造:
-ecomstore
---- +manage.py
----その他のディレクトリ
----catalog
------- + models.py
------- +forms.py <-アクティブなファイル呼び出しインポート用
----ecomstore<-実際のプロジェクトフォルダー、settings.pyなどが含まれます
------- + settings.py
用語が間違っていることをお詫びしますが、私はまだJavaから移行中であり、専門用語を学ぶのに少し時間がかかります。
同じ名前のディレクトリからいくつかの問題が発生したため、「プロジェクトフォルダ」はプロジェクトのルートフォルダと同じ名前であると指摘しましたが、ルートレベルのディレクトリを「テスト」に変更した後でも、インポートまだ失敗していたので除外しましたが、間違っていたのかもしれません。また、forms.pyがmodels.pyと同じディレクトリにあることに注意してください。これは、「Product」クラスを含むファイルです...それは、Eclipseでのソースフォルダーのセットアップが追加に失敗した場合でも、それを意味するものではありません。それ自体がPYTHONPATHにある場合、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
編集1
言及するのを忘れました。「ecomstore.catalog.models」から「ecomstore」を削除しようとしましたが、それでEclipseエラーは解決しますが、検証エラーは同じままです。
編集2
コマンドラインを開き、sys.pathを印刷して、正常にそこにあるものを確認しました。通常のC:\ Python27のものはそこにありましたが、ecomstoreを参照するものは何もありませんでした...私が使用している本がsys.pathを扱うように私に言わなかったので、manage.dbが私のためにそれを追加していると思いました...これはおそらく私のエラー?「pythonmanage.dbvalidate」は私のルートecomstoreフォルダーをどの程度正確に検出しますか?ルートフォルダ内の場所のおかげで、おそらく?
編集3
問題を修正しようとするこのすべてのいじりのどこかで、サーバー自体が「ImportError:カタログという名前のモジュールがありません」に完全に巻き込まれました。今、私が何かをしようとするとrunserver
、それだけでもエラーがスローされます。
編集4
以下は私のルートecomstoreディレクトリにある私のmanage.pyです。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', 'your_email@example.com'),
)
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のみを編集したと思いますが、それでもすべてです。
編集5
私は問題の少なくとも一部を解決し、問題を切り分けました。との両方ecomstore.catalog
を削除することでcatalog
、INSTALLED_APPS
manage.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']