Asked 5 months ago by MeteorPilot393
How can I automatically record the logged-in user in the created_by and updated_by fields of a Django model?
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
Asked 5 months ago by MeteorPilot393
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
Hi Team,
I’m new to Django and have been struggling to capture the current logged-in user when creating or modifying a record. I want the created_by field to automatically store the user who created the record and the updated_by field to capture the user making modifications. However, in the Django admin, these fields display as dropdowns instead of automatically saving the logged-in user. I’ve attempted a few methods, including overriding the save method and experimenting with serializers, but haven’t succeeded. Below is my current implementation. Any guidance or suggestions on how to properly capture the user in these fields would be appreciated.
I have the following model in models.py:
PYTHONfrom django.db import models from django.conf import settings from django.contrib.auth.models import User #from django_currentuser.middleware import get_current_authenticated_user class Member(models.Model): firstname = models.CharField(max_length=50) lastname = models.CharField(max_length=50) phone = models.IntegerField(null=True) joined_date = models.DateField(null=True) slug = models.SlugField(default="", null=False) created_dt = models.DateField(auto_now_add=True, null=True) last_modified_dt = models.DateField(auto_now=True, null=True) # Automatically set on every update #created_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name='created_by') #updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name='updated_by') created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='created_by') updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='updated_by') def __str__(self) -> str: return f"{self.firstname} {self.lastname}" def save(self, *args, **kwargs): # Set the author to the current user before saving if not self.pk: # Check if it's a new instance self.created_by = kwargs.pop('User', None) super().save(*args, **kwargs)
And in admin.py I have:
PYTHONfrom django.contrib import admin from django.forms import ModelForm from django.http import HttpRequest from .models import Member # Register your models here. #@admin.register(Member) class MembersAdmin(admin.ModelAdmin): list_display = ("firstname", "lastname", "joined_date") prepopulated_fields = {"slug": ("firstname", "lastname")} admin.site.register(Member, MembersAdmin)
If you need further details about views.py or settings.py, please let me know.
Comments 0
•Answers 1
•Views 311
Answer by TychoAI Agent • 9 days ago
To automatically set the created_by
and updated_by
fields to the current logged-in user in the Django admin, you need to override the save_model()
method in your ModelAdmin
class. The current approach in your model's save()
method won't work because it doesn't have access to the request object that contains the user information.
Here's how to implement this correctly:
PYTHONfrom django.contrib import admin from .models import Member class MembersAdmin(admin.ModelAdmin): list_display = ("firstname", "lastname", "joined_date", "created_by", "updated_by") prepopulated_fields = {"slug": ("firstname", "lastname")} def save_model(self, request, obj, form, change): if not change: # If creating a new object obj.created_by = request.user obj.updated_by = request.user # Always set updated_by to current user super().save_model(request, obj, form, change) admin.site.register(Member, MembersAdmin)
You can simplify your model's save method since the user handling will be done in the admin:
PYTHONfrom django.db import models from django.contrib.auth.models import User class Member(models.Model): firstname = models.CharField(max_length=50) lastname = models.CharField(max_length=50) phone = models.IntegerField(null=True) joined_date = models.DateField(null=True) slug = models.SlugField(default="", null=False) created_dt = models.DateField(auto_now_add=True, null=True) last_modified_dt = models.DateField(auto_now=True, null=True) created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='created_by') updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='updated_by') def __str__(self) -> str: return f"{self.firstname} {self.lastname}"
save_model()
method in ModelAdmin
is called when saving an object through the admin interface.request
parameter contains the current HTTP request, which includes the logged-in user.change
parameter is True
if editing an existing object, and False
if creating a new one.created_by
only when creating a new object, and always update updated_by
.This approach ensures that:
created_by
and updated_by
are set to the current userupdated_by
is changed to the current userIf you need to implement this behavior outside the admin interface (e.g., in your views), you would need to use a similar approach in your view's form handling.
Tycho is an AI agent, that grounds responses in various sources like documentation, code bases, live discussions, and relevant posts. Want to chat privately with Tycho?
No comments yet.
No comments yet.