объект "module" не имеет атрибута "views" ошибка django

Если я импортирую встроенный вид входа django, как в следующем коде

from django.conf.urls import patterns, include, url
from django.contrib.auth.views import login

urlpatterns = patterns('',    
    url(r'login/$', login, name='login'),
)

все работает нормально, но если я включу его следующим образом

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

urlpatterns = patterns('',    
    url(r'login/$', auth.views.login, name='login'),
)

Я получаю следующую ошибку

Exception Value: 'module' object has no attribute 'views'

что меня действительно беспокоит в другом проекте, я импортирую его вторым способом, и он работает нормально. Кто-нибудь знает, что здесь происходит?

2 ответов


во втором проекте вы, вероятно, уже импортировали auth.views модуля перед вызовом auth.views.login. Python сшивает импортированные модули, когда это возможно.

например, это будет работать

>>> from django.contrib.auth.views import login #or from django.contrib.auth import views
>>> from django.contrib import auth

>>> auth.views.login
<function login at 0x02C37C30>

первый импорт даже не должен упоминать login вид. Это тоже сработает.

>>> from django.contrib.auth.views import logout
...
#then import auth.views.login

следующее не будет, потому что python не знает о views модуль, так как он не зарегистрирован в auth.__init__.py

>>> from django.contrib import auth

>>> auth.views.login
...
AttributeError: 'module' object has no attribute 'views'

в первом импорт (from django.contrib.auth.views import login), синтаксис точки пересекает иерархию модулей. В доступе urlpattern (auth.views.login), точечный синтаксис делает свойство (т. е. класс) Поиск. Из моего shell_plus вы можете видеть, что" auth " не имеет свойства views.

In [1]: from django.contrib import auth

In [2]: auth.<TAB FOR COMPLETION>
auth.BACKEND_SESSION_KEY      auth.load_backend
auth.ImproperlyConfigured     auth.login
auth.PermissionDenied         auth.logout
auth.REDIRECT_FIELD_NAME      auth.models
auth.SESSION_KEY              auth.re
auth.authenticate             auth.rotate_token
auth.forms                    auth.settings
auth.get_backends             auth.signals
auth.get_permission_codename  auth.tokens
auth.get_user                 auth.user_logged_in
auth.get_user_model           auth.user_logged_out
auth.hashers                  auth.user_login_failed
auth.import_by_path           

вот почему он дает вам ошибку. Это действительно не должно работать, если вы пытаетесь это сделать в другом проекте/файле-если только ваш другой проект auth.__init__.py автоматически загружает свои подмодули.