2009-07-15 23 views
83

Tôi đang cố gắng lưu trữ ID của người dùng trong phiên sử dụng django.contrib.auth.login. Nhưng nó không hoạt động như mong đợi.Django "login() lấy chính xác 1 đối số (2 đã cho)" lỗi

Tôi nhận được lỗi đăng nhập() có chính xác 1 lập luận (2 nhất định)

Với đăng nhập (user) Tôi nhận được AttributeError tại/đăng nhập/User' đối tượng đã không có thuộc tính 'phương pháp'

tôi đang sử dụng hơi modifyed hình thức ví dụ http://docs.djangoproject.com/en/dev/topics/auth/:

from django.shortcuts import render_to_response 
from django.contrib.auth import authenticate, login 

def login(request): 
    msg = [] 
    if request.method == 'POST': 
     username = request.POST['u'] 
     password = request.POST['p'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       msg.append("login successful") 
      else: 
       msg.append("disabled account") 
     else: 
      msg.append("invalid login") 
    return render_to_response('login.html', {'errors': msg}) 

không có gì đặc biệt về login.html:

<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <form action="/login/" method="post"> 
     Login:&nbsp; <input type="text" name="u"> 
    <br/> 
     Password:&nbsp; <input type="password" name="p"> 
     <input type="submit" value="Login"> 
    </form> 
    {% if errors %} 
     <ul> 
      {% for error in errors %} 
      <li>{{ error }}</li> 
      {% endfor %} 
     </ul> 
    {% endif %} 

</body> 
</html> 

Có ai có ý tưởng làm cách nào để đăng nhập() hoạt động.

+3

sẽ hoạt động nếu bạn đổi tên chế độ xem của mình – Evgeny

+0

Chỉ là câu hỏi và câu trả lời tôi đang tìm kiếm. Một trong những sai lầm tôi đã thực hiện trong khi cố gắng để có được đăng nhập và chạy trong django, cùng với việc sử dụng Contexts vs RequestContexts và rời khỏi csrf_tokens. – chucksmash

+0

ở đây bạn có thể tìm thấy một hướng dẫn về người dùng Django http://lowcoupling.com/post/71289666862/django-the-user-tutorial đó cũng là một dự án GitHub bạn có thể sao chép và kiểm tra – lowcoupling

Trả lời

230

chức năng xem của bạn cũng được gọi là login, và cuộc gọi đến login(request, user) kết thúc lên được hiểu như là một nỗ lực để gọi chức năng này một cách đệ quy:

def login(request): 
    ... 
    login(request, user) 

Để tránh nó đổi tên chức năng nhìn của bạn hoặc tham khảo các login từ django.contrib.auth theo một cách khác. Bạn có thể ví dụ như thay đổi việc nhập khẩu để đổi tên các chức năng đăng nhập:

from django.contrib.auth import login as auth_login 

... 
auth_login(request, user) 
+0

Wow, tôi đã duyệt qua mã nguồn của Django và cố gắng sử dụng mọi phiên bản cũ hơn, tôi nghĩ rằng tôi sẽ phát điên – Mojimi

15

Một khả năng sửa chữa:

from django.contrib import auth 

def login(request): 
    # .... 
    auth.login(request, user) 
    # ... 

Bây giờ tên view của bạn không ghi đè lên tên xem django của.

9

Một cách khác:

from django.contrib.auth import login as auth_login 

sau đó gọi auth_login(request, user) thay vì login(request, user).

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