The ThreadLocalMiddleware processes each request and stores the current HttpRequest object in the current thread. Each request–response cycle in Django is single threaded. We have created two functions: get_current_request() and get_current_user(). These functions can be used from anywhere to grab the current HttpRequest object or the current user, respectively.
For example, you can use this middleware to develop and use CreatorMixin, which will save the current user as the creator of a new model object, as follows:
# myproject/apps/core/models.py
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
class CreatorBase(models.Model):
"""
Abstract base class with a creator
"""
creator = models.ForeignKey(
settings.AUTH_USER_MODEL,
verbose_name=_("creator"),
editable=False,
blank=True,
null=True,
on_delete=models.SET_NULL,
)
class Meta:
abstract = True
def save(self, *args, **kwargs):
from .middleware import get_current_user
if not self.creator:
self.creator = get_current_user()
super().save(*args, **kwargs)
save.alters_data = True