Mystery
Mystery

Reputation: 81

getting datetime when user logs-in

i made a django app which contains a user login form. I have used MySQL database in the app. when the user logs-in an entry of name and Hashed Password is created in the database. As of now i m trying, to get the datetime in the database when the user logs-In.

here's the code

form.py

from django import forms
from django.contrib.auth.hashers import make_password
from django.core import validators
from first_app.models import Login
from django.contrib.auth.models import User

#some other code

class authForm(forms.ModelForm):
    class Meta:                                 
        model= Login
        fields = ["username","password",]

models.py

from django.db import models
from datetime import datetime
from django.contrib.auth.models import User

# Create your models here.

class Login(models.Model):



    username = models.CharField(max_length=50) 
    password = models.CharField(max_length=32)

    date_and_time = models.DateField(auto_now_add=True)  #<-- tried to add but it shows a non editable field



    def __str__(self):                               
        return self.username

Views.py

from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .forms import authForm
#from django.contrib.sessions import serializers

# Create your views here.
def login_view(request):
    context = {}
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        authform_data = authForm (request.POST or None)

        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            authform_data.save()
            return HttpResponseRedirect(reverse('IP form'))
        else:
            messages.error(request,'Please provide valid credentials')
            return render (request,"first_app/login.html", context)

    else:
        return render (request,"first_app/login.html", context)

I want to store the datetime Everytime the user logs-In

thnx for the help. :-)

Upvotes: 0

Views: 726

Answers (2)

Iain Shelvington
Iain Shelvington

Reputation: 32294

The built in User model has an attribute last_login that stores what you are asking for

Your custom user model doesn't seem to add any functionality that the built in user doesn't have, might be best to just use auth.User

EDIT:

To store every login time for every user would be best stored in it's own model

class UserLogin(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    time = models.DatetimeField(auto_now_add=True)

There is a signal sent every time a user logs in user_logged_in, you can hook up this signal to a function that creates a UserLogin entry every time a user logs in

from django.contrib.auth.signals import user_logged_in
from django.dispatch import receiver

@receiver(user_logged_in)
def my_callback(sender, request=None, user=None):
    UserLogin.objects.create(user=user)

Now you will have a UserLogin object for every login for each user

Upvotes: 0

cagrias
cagrias

Reputation: 1847

You can define a login event model and create instance every time a user is logged-in. Here is an example:

# models.py
from django.db import models
from datetime import datetime
from django.contrib.auth.models import User


class LoginEvent(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date_and_time = models.DateField(auto_now_add=True)


class Login(models.Model):
    username = models.CharField(max_length=50) 
    password = models.CharField(max_length=32)

    date_and_time = models.DateField(auto_now_add=True)

    def __str__(self):                               
        return self.username

Then in your views:

from datetime import datetime

from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .forms import authForm
from .models import Login, LoginEvent


def login_view(request):
    context = {}
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        authform_data = authForm(request.POST or None)

        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            # here, create your event object
            login_event = LoginEvent.objects.create(user=user)
            authform_data.save()
            return HttpResponseRedirect(reverse('IP form'))
        else:
            messages.error(request,'Please provide valid credentials')
            return render (request,"first_app/login.html", context)

    else:
        return render (request,"first_app/login.html", context)

Upvotes: 1

Related Questions