2014-04-26 15 views
9

Se importare Django di costruito in vista di login come nel codice seguenteoggetto 'modulo' ha errore Django 'viste' nessun attributo

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

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

ogni cosa funziona bene, ma se io includerlo nel modo seguente

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

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

ottengo il seguente errore

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

ciò che sta realmente disturbando me è in un altro progetto che ho sto importando il secondo modo e sta funzionando bene. Qualcuno sa cosa sta succedendo qui?

risposta

10

Nel secondo progetto probabilmente è già stato importato il modulo auth.views prima di chiamare auth.views.login. Python lega i tuoi moduli importati quando può.

Per esempio, questo funzionerà

>>> 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> 

La prima importazione non ha nemmeno bisogno di parlare della vista login. Anche questo funzionerà.

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

Quanto segue non perché python non sa del modulo views dal momento che non è registrato in auth.__init__.py

>>> from django.contrib import auth 

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

Sembra che ho perso un punto molto importante, mentre l'apprendimento di pitone. Non ricordo di averlo letto da nessuna parte che "Non è possibile importare un pacchetto e poi chiamare più tardi package.module.function()." Nessun corpo sembra parlare di questa restrizione dei pacchetti ovunque. – nik

+1

@Nik Ho anche dovuto imparare il modo in cui ho sentito, ma è solo perché non avevo capito bene come funziona l'importazione in python. Una volta capito, è abbastanza ovvio perché ciò accade. – vikki

1

Nella prima importazione (from django.contrib.auth.views import login), la sintassi del punto sta attraversando la gerarchia del modulo. Nell'accesso urlpattern (auth.views.login), la sintassi del punto sta eseguendo la ricerca delle proprietà (ad esempio la classe). Da mia shell_plus, puoi vedere che "auth" non ha una proprietà 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   

Questo è il motivo per cui si sta dando un errore. In realtà, non dovrebbe funzionare se lo stai provando anche in un altro progetto/file, a meno che il tuo altro auth.__init__.py stia caricando automaticamente i suoi sottomoduli.

Problemi correlati