Estoy tratando de almacenar la ID del usuario en la sesión usando django.contrib.auth.login. Pero no está funcionando como se esperaba.
Recibo un error de inicio de sesión () toma exactamente 1 argumento (2 dados)
Con el inicio de sesión (usuario) obtengo AttributeError en / login / User 'el objeto no tiene atributo' método '
Estoy usando un formulario de ejemplo ligeramente modificado 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})
no hay nada especial en login.html:
<html>
<head>
<title></title>
</head>
<body>
<form action="/login/" method="post">
Login: <input type="text" name="u">
<br/>
Password: <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>
¿Alguien tiene idea de cómo hacer que login () funcione?
Respuestas:
También se llama a su función de vista
login
, y la llamada alogin(request, user)
termina siendo interpretada como un intento de llamar a esta función de forma recursiva:def login(request): ... login(request, user)
Para evitarlo, cambie el nombre de su función de vista o consulte el
login
dedjango.contrib.auth
de alguna manera diferente. Por ejemplo, podría cambiar la importación para cambiar el nombre de la función de inicio de sesión:from django.contrib.auth import login as auth_login ... auth_login(request, user)
fuente
Una posible solución:
from django.contrib import auth def login(request): # .... auth.login(request, user) # ...
Ahora el nombre de su vista no sobrescribe el nombre de la vista de django.
fuente
De otra manera:
from django.contrib.auth import login as auth_login
luego llame en
auth_login(request, user)
lugar delogin(request, user)
.fuente