Django(PyDev)中的my_app.views中的基本、未解析导入



我在home/DjangProjects/django_bookmarks/env/djang_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

在/书签/视图具有:

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/url具有:

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

我在这里读到,人们在导入模块时遇到了问题,主要是因为应用程序目录中缺少init.py,或者PYTHONPATH设置有问题。我读的东西并没有帮助我解决问题。

*我是Django的一名程序员,这是我第一次写Django。这是AymanHourieh在《与Django一起学习网站开发》一书中的一个例子。

您需要通知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'))
)

在书签/网址.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模式都位于bookmarks/urls.py.

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

最新更新