2010-03-26 9 views

Respuesta

4

Sí, en cierto sentido. Necesitará un campo en el modelo UserProfile de su aplicación para mantener el número de inicios de sesión o un modelo separado para almacenar el historial de inicio de sesión completo. A continuación, agregue manejadores de señal para las actualizaciones last_login y regístrelos en un modelo de su elección. Aquí está mi ejemplo:

from django.db import models, signals 
from django.contrib.auth.models import User 

class UserLogin(models.Model): 
    """Represent users' logins, one per record""" 
    user = models.ForeignKey(user) 
    timestamp = models.DateTimeField() 

def user_presave(sender, instance, **kwargs): 
    if instance.last_login: 
     old = instance.__class__.objects.get(pk=instance.pk) 
     if instance.last_login != old.last_login: 
      instance.userlogin_set.create(timestamp=instance.last_login) 

signals.pre_save.connect(user_presave, sender=User) 
+0

gracias a que funciona perfectamente. – Sujit

+0

Es una cuestión de estilo, pero ¿dónde pondrías esto en django (qué archivo?). ¿Crearías una nueva aplicación? Gracias. – Roger

+0

'UserProfile' va a' models.py', el manejador de señal va a 'listeners.py', ambos en su aplicación principal. –

9

También hay un 'user_logged_in' señal que va a hacer el truco con la necesidad de comprobar si hay últimos inicios de sesión etc.

class UserLogin(models.Model): 
    """Represent users' logins, one per record""" 
    user = models.ForeignKey(user) 
    timestamp = models.DateTimeField() 

from django.contrib.auth.signals import user_logged_in 

def update_user_login(sender, user, **kwargs): 
    user.userlogin_set.create(timestamp=timezone.now()) 
    user.save() 

user_logged_in.connect(update_user_login) 
+0

Agregué este bit a mi modelo UserProfile, pero no parece estar encendiendo en el inicio de sesión del usuario (se crea la tabla account_userlogin). ¿Alguna idea? –

2

Esta es la forma en que lo hice (usando Django 1.7), similar a la respuesta de Guy Bowden:

from django.contrib.auth.models import User 
from django.contrib.auth.signals import user_logged_in 

class LoginUpdate(models.Model): 
    date_updated = models.DateTimeField(auto_now_add=True, null=True) 
    action_type = models.CharField(max_length=5) 
    action_user = models.ForeignKey(User, null=True, blank=True) 

def update_user_login(sender, **kwargs): 
    user = kwargs.pop('user', None) 
    LoginUpdate.objects.create(action_type="Login", action_user=user) 

user_logged_in.connect(update_user_login, sender=User) 

Más tarde se puede contar el número de inicios de sesión, en sus puntos de vista.

+0

Gracias, la implementé pero estoy atascado en cómo contar el número de inicios de sesión, y mostrarlos en el administrador. ¿Debo trabajar en admin.py, views.py, models.py? (django beginnner aquí) – juminet

+0

@juminet, el método que proporcioné, SÓLO guarda 'date_updated', 'action_type' y 'action_user', en nuestra base de datos. Luego puedes contar 'action_type' para un usuario específico, usando django queryset (https: // docs .djangoproject .com/es/1.11/ref/models/querysets/# count). Por lo tanto, su queryset debería tener el siguiente aspecto: LoginUpdate.objects.filter (action_type = "Login", action_user = SPECIFIC_USER) .count() –

0

Puede usar django-timeStamps para almacenar los tiempos de inicio de sesión. Una herramienta simple y liviana.

Cuestiones relacionadas