If I import django's built in login view as in following code
from django.conf.urls import patterns, include, url
from django.contrib.auth.views import login
urlpatterns = patterns('',    
    url(r'login/$', login, name='login'),
)
every thing works fine, but if I'll include it in following way
from django.conf.urls import patterns, include, url
from django.contrib import auth
urlpatterns = patterns('',    
    url(r'login/$', auth.views.login, name='login'),
)
I get the following error
Exception Value: 'module' object has no attribute 'views'
what is really bothering me is in another project I am importing it the second way and it is working fine. Does anyone know what's going on over here?
In the second project you've probably already imported the auth.views module before  calling auth.views.login. Python stitches your imported modules when it can.
For example, this will work
>>> 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>
The first import doesn't even have to mention the login view. This will also work.
>>> from django.contrib.auth.views import logout
...
#then import auth.views.login
The following won't because python does not know of the views module since it isn't registered in auth.__init__.py
>>> from django.contrib import auth
>>> auth.views.login
...
AttributeError: 'module' object has no attribute 'views'
                        In the first import (from django.contrib.auth.views import login), the dot syntax is traversing the module hierarchy.  In the urlpattern access (auth.views.login), the dot-syntax is doing property (ie. class) lookup. From my shell_plus, you can see that "auth" doesn't have a views property.
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           
This is why it's giving you an error.  It really shouldn't work if you're trying that in another project/file either -- unless your other project's auth.__init__.py is auto-loading its submodules.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With