2010-03-26 8 views

risposta

4

Sì, in un certo senso. Avrai bisogno di un campo nel modello UserProfile della tua app per contenere il numero di accessi o un modello separato per la memorizzazione della cronologia di accesso completa. Quindi aggiungi i gestori di segnale per gli aggiornamenti last_login e registrali in un modello di tua scelta. Ecco il mio esempio:

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

grazie al suo funzionamento perfetto. – Sujit

+0

È una questione di stile, ma dove lo inseriresti in django (quale file?). Vuoi creare una nuova app? Grazie. – Roger

+0

'UserProfile' va a' models.py', il gestore di segnale va a 'listeners.py', entrambi nell'applicazione principale. –

9

C'è anche una 'user_logged_in' segnale che farà il trucco con la necessità di verificare la presenza di ultimi dati di accesso, ecc

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

Ho aggiunto questo bit al mio modello UserProfile, ma non sembra che si spari all'accesso utente (la tabella account_userlogin è stata creata tutte le idee? –

2

Questo è come ho fatto (usando django 1.7), simili a Guy Bowden risposta:

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) 

Successivamente è possibile contare il numero di accessi, nelle viste.

+0

Grazie, l'ho implementato ma sono bloccato su come contare il numero di accessi e visualizzarli nell'amministratore. Dovrei lavorare in admin.py, views.py, models.py? (django beginnner qui) – juminet

+0

@juminet, il metodo che ho fornito, salva SOLO 'date_updated', 'action_type' e 'action_user', nel nostro database, quindi puoi contare 'action_type' per un utente specifico, usando django queryset (https: // docs .djangoproject .com/it/1.11/ref/models/querysets/# count). Quindi il tuo queryset dovrebbe apparire così: LoginUpdate.objects.filter (action_type = "Login", action_user = SPECIFIC_USER) .count() –

0

È possibile utilizzare django-timeStamps per memorizzare i tempi di accesso in corso. Un semplice strumento leggero.

Problemi correlati