在 Django 中显示加入日期和 last_login

Display join date and last_login in Django

我有用户默认的 Django 用户模型来注册用户。我想在模板上打印用户 last_login 和 join_date。而且我还想检查用户是否活跃。

我想像这样检查用户活动状态,如果用户当前正在使用我的网站,则状态应为“活动”如果用户已注销,则状态应为“已注销” 如果可能,请也为我提供解决方案

accounts/models.py


class Profile(models.Model):
    user = models.OneToOneField(User, default="1", on_delete=models.CASCADE)
    image = models.ImageField(upload_to="images/", default="default/user.png")

    def __str__(self):
        return f'{self.user} profile'

dashboard/views.py(显示用户数据)

def admin_home(request):
    data = Profile.objects.filter(Q(user__is_superuser=False), Q(
        user__is_staff=False)).order_by('-user__last_login')[:10]
    context = {
        'data': data,
    }
    return render(request, "instructor/admin_home.html", context)

Accounts/urls.py


from django.contrib import admin
from . import views
from django.contrib.auth import views as auth_views
from django.urls import path
app_name="accounts"
urlpatterns=[
    path('register',views.register,name="register"),
    path('admin_login',views.admin_login,name="admin_login"),

    path('user_login',views.user_login,name="user_login"),

    path('admin_editprofile',views.admin_editprofile, name="admin_editprofile"),
    path('user_editprofile',views.user_editprofile, name="user_editprofile"),
    path('admin_profile',views.admin_profile, name="admin_profile"),
    path('user_profile',views.user_profile, name="user_profile"),
    path('Logout',views.Logout, name="Logout"),
    path('user_chage_password' , views.user_chage_password , name="user_chage_password"),
    path('admin_change_password',views.admin_change_password,name="admin_change_password"),

]

额外我有两个应用程序,一个是仪表板和其他帐户。在帐户应用程序中,我仅实现帐户的相关 URL,而在仪表板应用程序中,我将其用于其他用途。

对于用户注册,我使用 Django 的默认 User 模型。

show_all_users.html 或模板文件(用于显示用户数据)

    <html lang="en" class="no-focus">
    <head>
      {% load static %}

        <link rel="stylesheet" href="{% static 'js/plugins/datatables/dataTables.bootstrap4.min.css' %}">

        <link rel="stylesheet" id="css-main" href="{% static 'css1/codebase.min.css' %}">

    </head>
    <body>
        
        <div id="page-container" class="sidebar-o sidebar-inverse side-scroll page-header-fixed main-content-narrow">
           
         {% include "instructor/sidebar.html" %}

              {% include "instructor/admin_nav.html" %}

            <!-- Main Container -->
            <main id="main-container" style="background-color:white;">
                <!-- Page Content -->
                <div class="content">
             

    <div class=" container  mt-5" style=" position: absolute; margin-left:-4%;">
    <div>
      <h1 class="text-success text-center"></h1>
            <h4 class="text-center text-danger">Recently Logged in users</h4>
    <table id="datatable" class="table table-striped table-bordered" style="width:100% color:gray;" >

    <thead style="background-color : #607d8b;">
    <tr>
    <th scope="col">ID</th>
    <th scope="col">Profile</th><th scope="col">Username</th>
        <th scope="col">Last_login</th>
        <th scope="col">join_date</th>
        <th scope="col">Action</th>
    </tr></thead>
    <tbody>
    {% for userData in data %}
    <tr>
        <th scope="row">{{userData.id}}</th>
        <td><img style="width: 40px; border-radius:15px;" src="{{userData.image.url}}" alt="this is it."></td>
        <td>{{userData.user.username}}</td>
        <td> {{request.user.profile.date_joined }}</td>
        <td>{{ request.user.profile.last_login }} </td>
        

        <td>

        <a href="{% url 'dashboard:delete_user' userData.id %}"> <button class="btn btn-danger btn-sm" onclick="window.mytest()">Delete</button></a>
        <script type="text/javascript">window.mytest = function() { var isValid = confirm('Are you sure to Delete this user?');
        if (!isValid) { event.preventDefault();  alert("It wont delete. Yay!");}}</script>
            
        </td>
        
    </tr>
    {% endfor %} </tbody></table></div>
    </div>
    </main>
    {% endblock body %}

但是此 <td> {{request.user.profile.date_joined }}</td> 行打印当前登录用户的登录日期,但我想显示所有用户的 last_login 日期。

并且这一 <td>{{ request.user.profile.last_login }} </td> 行不打印任何内容。

创建 signals.py 并添加此代码段:

from django.contrib.auth.signals import user_logged_in,user_logged_out
from datetime import datetime

@receiver(user_logged_in)
def user_logged(sender,request,user,**kwargs):
    user.profile.last_login = datetime.now()
    user.profile.save()

related_name 属性添加到 个人资料 模型下方的用户字段:

class Profile(models.Model):
    user = models.OneToOneField(User,default="1", on_delete=models.CASCADE, related_name="profile")   
    image = models.ImageField(upload_to="images",default="default/user.png")
    date_joined = models.DateTimeField()

    def save(self, *args, **kwargs) -> None:
        self.date_joined = datetime.now()
        return super().save(*args, **kwargs)

    def __str__(self):
        return f'{self.user} profile'

运行 在终端上:

python manage.py makemigrations    

python manage.py migrate

the official documentation

问题:

只有last_logindate_joined是django默认User模型中的有效字段。

不要使用 request.user.....,因为它会打印当前登录用户的详细信息,正如您所说我希望它显示给所有用户。

Question 1: But this <td> {{request.user.profile.date_joined }}</td> line prints login date of currently logged in user but I want to show all user's last_login date.

Answer: This is because request... give you current logged in user's details not all users' details.

Question 2: And this <td>{{ request.user.profile.last_login }} </td> line prints nothing.

Answer: It is because, there is wrong relationship of models.



解决方案:

在模板文件中尝试以下代码以显示所有用户:

<td> {{userData.user.last_login }}</td>
<td>{{ userData.user.date_joined }} </td>

您试过以下代码:

<td> {{request.user.profile.date_joined }}</td>
<td>{{ request.user.profile.last_login }} </td>

Remember: Here, you have filtered only those users which are not staff as well as superuser, so these users are normal users. And if last_login column prints None that means the user has not logged even single time. And for date_joined,by default current time is taken by django. And if you see another time than your local machine that means you haven't set time zone in TIME_ZONE in settings.py. The timezone for India is Asia/kolkata, for more info refer Time zones[django-doc].

您可以通过Q(user__last_login__isnull=False)过滤至少登录过一次的用户。

在视图中尝试此查询:

views.py

def admin_home(request):
    data = Profile.objects.filter(Q(user__is_superuser=False), Q(
        user__is_staff=False), Q(user__last_login__isnull=False)).order_by('-user__last_login')[:10]
    context = {
        'data': data,
    }
    return render(request, "instructor/admin_home.html", context)