无法在django中导入视图,但它在django shell中有效

时间:2015-02-13 10:08:39

标签: python django

我有以下简单的urls.py:

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

urlpatterns = patterns('',
    url(r'^test$', 'views.test', name='test'),
)

以下基本观点: 来自django.shortcuts导入渲染

def test(request):
    return render(request, "base/test.html")

我有一个名为blog的项目和一个名为base的应用程序。

我知道我可以通过使用" base.views.test"来解决这个问题。在urls.py但理论上这应该工作我认为因为基本目录中有一个 init .py文件。

当使用views.test我得到"没有模块命名视图"作为django中的错误,但是当我在django shell中执行此操作时,它可以工作:

 from base import views
 views.test
 function test

我想知道为什么这会在django shell中运行而不是在django本身。无论我在django做什么,除了使用完整的绝对路径到视图我得到一个错误说我找不到一个名为views..so的模块基本上我正在寻找解释为什么它不工作,而不是解决方案,因为我知道我可以使用视图的完整路径并使其工作。

我已经在stackoverflow上看到了其他线程,其中用户遇到了同样的问题,但只提供了一个解决方案,没有解释......他们只告诉人们使用视图的完整路径,但我真的不明白为什么它不能正常工作那样..我知道我也可以这样做:

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

urlpatterns = patterns('base',
    url(r'^test$', 'views.test', name='test'),
)

但是我试图理解为什么它在使用"从基本导入视图"因为它认为这将与其他常规python模块一起工作。

文件结构:

.
├── base
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── models.py
│   ├── static
│   ├── templates
│   │   └── base
│   │       └── test.html
│   ├── tests.py
│   ├── views.py
│   └── views.pyc
├── blog
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
└── manage.py

添加时的新回溯(不带引号的views.test,删除旧的回溯以避免帖子变得太长且不可读):

Environment:


Request Method: GET
Request URL: http://localhost:8000/test

Django Version: 1.5
Python Version: 2.7.7
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'blog')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/Users/exceed/code/python/lib/python27/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  92.                     response = middleware_method(request)
File "/Users/exceed/code/python/lib/python27/lib/python2.7/site-packages/django/middleware/common.py" in process_request
  69.             if (not urlresolvers.is_valid_path(request.path_info, urlconf) and
File "/Users/exceed/code/python/lib/python27/lib/python2.7/site-packages/django/core/urlresolvers.py" in is_valid_path
  551.         resolve(path, urlconf)
File "/Users/exceed/code/python/lib/python27/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  440.     return get_resolver(urlconf).resolve(path)
File "/Users/exceed/code/python/lib/python27/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  319.             for pattern in self.url_patterns:
File "/Users/exceed/code/python/lib/python27/lib/python2.7/site-packages/django/core/urlresolvers.py" in url_patterns
  347.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/Users/exceed/code/python/lib/python27/lib/python2.7/site-packages/django/core/urlresolvers.py" in urlconf_module
  342.             self._urlconf_module = import_module(self.urlconf_name)
File "/Users/exceed/code/python/lib/python27/lib/python2.7/site-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/Users/exceed/code/python/django/blog/blog/urls.py" in <module>
  8.     url(r'^test$', views.test, name='test'),

Exception Type: NameError at /test
Exception Value: name 'views' is not defined

1 个答案:

答案 0 :(得分:1)

只需传递您的视图函数而不是带有点路径的字符串:

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

from base import views

urlpatterns = patterns('',
    url(r'^test$', views.test, name='test'),
)

快速解释:您可以将url的第二个参数传递给函数或带有虚线路径的字符串。当它是一个函数时,django只会在打开url时调用它,当它是虚线路径时:django将在PYTHONPATH中搜索该函数。如果您在urls.py内导入模块并不重要,django将始终在PYTHONPATH中搜索。您还可以将前缀传递给模式的第一个参数,并且将相对于该前缀搜索由虚线路径字符串给出的所有函数。

因此,如果您不想将前缀传递给patterns(例如,因为您使用的是多个应用且只有一个patterns,此处唯一的解决方案是传递函数而不是点缀您还可以使用多个patterns(并在每个patterns中指定不同的前缀),然后将它们包含在主{{1}}中(不会将前缀传递给它)。