2014-04-26 35 views
9

Nếu tôi nhập khẩu của django xây dựng theo quan điểm đăng nhập như trong đoạn mã sau'module' đối tượng có lỗi django 'views' không có thuộc tính

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

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

mọi thứ hoạt động tốt, nhưng nếu tôi sẽ đưa nó vào sau cách

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

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

tôi nhận được lỗi sau

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

gì đang thực sự làm phiền tôi là trong một dự án khác tôi đang nhập nó theo cách thứ hai và nó hoạt động tốt. Có ai biết chuyện gì đang diễn ra ở đây không?

Trả lời

10

Trong dự án thứ hai, bạn có thể đã nhập mô-đun auth.views trước khi gọi auth.views.login. Python sẽ khâu các mô-đun đã nhập của bạn khi có thể.

Ví dụ, điều này sẽ làm việc

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

Việc nhập khẩu đầu tiên thậm chí không cần phải đề cập đến quan điểm login. Điều này cũng sẽ làm việc.

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

Sau đây sẽ không phải vì trăn không biết của mô-đun views vì nó không được đăng ký tại auth.__init__.py

>>> from django.contrib import auth 

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

Nó có vẻ như tôi đã bỏ lỡ một điểm rất quan trọng khi học python. Tôi không thể nhớ đọc nó bất cứ nơi nào mà "Bạn không thể nhập một gói và sau đó trên package.module.function call() sau này." Không cơ thể dường như để nói về hạn chế này của các gói bất cứ nơi nào. – nik

+1

@Nik Tôi cũng phải học cách nghe, nhưng nó chỉ bởi vì tôi đã không đúng cách hiểu như thế nào nhập khẩu làm việc tại python. Một khi bạn hiểu nó, nó là khá rõ ràng lý do tại sao điều này xảy ra. – vikki

1

Trong nhập khẩu đầu tiên (from django.contrib.auth.views import login), dấu chấm cú pháp được đi qua hệ thống phân cấp mô-đun. Trong việc tiếp cận URLPATTERN (auth.views.login), dot-cú pháp đang làm tài sản (ví dụ. Lớp) tra cứu. Từ shell_plus của tôi, bạn có thể thấy rằng "auth" không có một tài sản quan điểm.

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   

Đây là lý do tại sao nó gây lỗi cho bạn. Nó thực sự không nên hoạt động nếu bạn đang cố gắng trong một dự án khác/tập tin, hoặc - trừ khi các dự án khác của bạn auth.__init__.py là tự động tải submodules của nó.

Các vấn đề liên quan