3

我在 home/DjangoProjects/django_bookmarks/env/django_bookmarks 中的项目树看起来像:

django_bookmarks/ #project
    django_bookmarks/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    bookmarks/ #made with python manage.py startapp bookmarks
        __init__.py
        models.py
        test.py
        views.py
    manage.py

在 ../bookmarks/views 中有:

from django.http import HTTPResponse

def main_page(request):
    output = '''
    <html>
    <head><title>%s</title></head>
    <body>
    <h1>%s</h1><p>%s</p>
    </body>
    </html>
    ''' % (
    'Django Bookmarks',
    'Welcome to Django Bookmarks',
    'Where you can store and share bookmarks!'
    )
    return HttpResponse(output)

在 .../django_bookmarks/urls 中有:

from django.conf.urls import patterns, include, url
from bookmarks.views import main_page # Unresolved import: main_page
# from bookmarks.views import * # Undefined variable: main_page in line below

...

urlpatterns = patterns('',
                       (r'^$', main_page)
)

编辑:

在 ../django_bookmarks/settings 中:

    # Django settings for django_bookmarks project.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '/home/novak/DjangoProjects/django_bookmarks/env/django_bookmarks/django_bookmarks/sqlite.db',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

# 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 = (
    # 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.
SECRET_KEY = '0i_*)b7)hc0oy^7qyit47w%k65pwfo7e@p)k=7lho3)q5!mx+!'

# 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 = 'django_bookmarks.urls'

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

TEMPLATE_DIRS = (
    # 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',
    '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',
)

# 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,
        },
    }
}

在 ../django_bookmarks/wsgi 中:

"""
WSGI config for django_bookmarks project.

This module contains the WSGI application used by Django's development server
and any production WSGI deployments. It should expose a module-level variable
named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
this application via the ``WSGI_APPLICATION`` setting.

Usually you will have the standard Django WSGI application here, but it also
might make sense to replace the whole Django WSGI application with a custom one
that later delegates to the Django one. For example, you could introduce WSGI
middleware here, or combine a Django application with an application of another
framework.

"""
import os

# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "django_bookmarks.settings"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_bookmarks.settings")

# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)

Django 版本是 1.5.1。当我运行项目 (ctrl+F11) 时,控制台中没有错误,只是 Eclipse 文本编辑器中的内联错误标记。Eclipse 显然以某种方式运行以前版本的代码,并且在浏览器中显示这个以前的版本忽略了这个错误。早些时候,同样的代码运行良好(这是书中的代码),因此我认为问题是 Eclipse 中的一些设置,或者最终是我创建这个项目的方式。我以这种方式创建了项目http://blog.bixly.com/post/25093181934/setting-up-eclipse-for-python-django-development

我在这里读到人们在导入模块时遇到问题,主要是因为 app 目录中缺少init .py 或 PYTHONPATH 设置存在问题。我读到的内容并没有帮助我解决我的问题。

*我是 Django 的初学者,这是我第一次编写 Django。这是 Ayman Hourieh 的“Learning Website Development with Django”一书中的一个例子。

4

2 回答 2

2

您需要通知 Python 解释器查看上面的一个目录。

尝试相对路径导入

from ..bookmarks.views import main_page

'..' 表示查看上面的目录以找到书签包。

我可以向您建议一个更强大的模式来实现这一点吗?

django_bookmarks/ #project
django_bookmarks/
    __init__.py
    settings.py
    urls.py
    wsgi.py
bookmarks/ #made with python manage.py startapp bookmarks
    __init__.py
    models.py
    test.py
    views.py
    urls.py # ADD another urls.py to your bookmarks app
manage.py

在 django_bookmarks/urls.py

from django.conf.urls import patterns, include, url
# from bookmarks.views import main_page # Remove this



# This directs Django to the urls.py within the bookmarks app
urlpatterns = patterns('',
    (r'^$', include('bookmarks.urls'))
)

在书签/urls.py

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



# This directs Django to the urls.py within the bookmarks app
urlpatterns = patterns('',
    (r'^$', views.main_page)
    # Now you can add more bookmark urls to match to bookmark views
)

这种模式更易于维护,并允许所有书签 url 模式存在于书签/urls.py 中。

于 2013-07-21T15:02:30.187 回答
1

好的,看来我解决了这个问题。问题在于我在 Eclipse 中制作这个 Django 项目的方式。我使用了 python virtualenv,它使用自己的env/bin/python2.7解释器创建了一个小环境,并且应该在创建项目对话框中选择这个解释器。这个 Python 没有预装 Django(当然),如果你想要的话,你必须安装它。我在我的env/制作中创建了这个项目,virtualenv但将解释器设置保留在“默认”上,因此 PyDev 没有使用系统中的 python 解释器env/bin/python2.7,也无法env/django_bookmarks/bookmarks在他的 PYTHONPATH 上找到导致ImportError. 结论实际上是合乎逻辑的,如果您在虚拟环境中制作 Django 项目,您可以使用虚拟环境中的 python 解释器。感谢 Paul Renton 抽出宝贵时间。

于 2013-07-24T17:29:31.760 回答