2010-03-26 21 views

回答

4

是的,從某種意義上說。您需要在應用的UserProfile模型中有一個字段用於保存登錄次數或用於存儲完整登錄歷史記錄的單獨模型。然後爲last_login更新添加信號處理程序,並將其記錄在您選擇的模型中。這是我的例子:

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

感謝它的完美工作。 – Sujit

+0

這是一個風格問題,但你會把它放在django(哪個文件?)。你會創建一個新的應用程序?謝謝。 – Roger

+0

'UserProfile'轉到'models.py',信號處理程序轉到'listeners.py',兩者都在你的主應用程序中。 –

9

還有一個「user_logged_in」信號會做的伎倆有,有必要檢查最後登錄等

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

我將此位添加到我的UserProfile模型,但它似乎並沒有觸發用戶登錄(account_userlogin table is created )。任何想法? –

2

這是我如何做(使用Django 1.7),類似於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) 

之後你可以統計你的視圖中登錄的次數。

+0

謝謝,我實現了它,但我堅持如何計算登錄數,並將它們顯示在管理員。我應該在admin.py,views.py,models.py?(django beginnner在這裏) – juminet

+0

@juminet,我提供的方法,只在數據庫中保存'date_updated','action_type'和'action_user',然後你可以使用django queryset(https:// docs)爲特定用戶計算'action_type' .djangoproject .com/en/1.11/ref/models/querysets /#count)。所以你的查詢集應該看起來像這樣:LoginUpdate.objects.filter(action_type =「Login」,action_user = SPECIFIC_USER).count() –

0

您可以使用django-timeStamps來存儲瑞速登錄時間。一個簡單的輕量級工具。