Мы можем решить эту проблему с помощью классов промежуточного слоя. Создайте класс singleton, в котором будет храниться пользовательская переменная.
class Singleton(type):
'''
Singleton pattern requires for GetUser class
'''
def __init__(cls, name, bases, dicts):
cls.instance = None
def __call__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls.instance
class NotLoggedInUserException(Exception):
'''
'''
def __init__(self, val='No users have been logged in'):
self.val = val
super(NotLoggedInUser, self).__init__()
def __str__(self):
return self.val
class LoggedInUser(object):
__metaclass__ = Singleton
user = None
def set_user(self, request):
if request.user.is_authenticated():
self.user = request.user
@property
def current_user(self):
'''
Return current user or raise Exception
'''
if self.user is None:
raise NotLoggedInUserException()
return self.user
@property
def have_user(self):
return not user is None
Создание собственного промежуточного класса, который будет настройки пользователя, например LoggedInUser и вставить из промежуточного уровня после того, как «» django.contrib.auth.middleware.AuthenticationMiddleware в settings.py
from useranytimeaccess import LoggedInUser
class LoggedInUserMiddleware(object):
'''
Insert this middleware after django.contrib.auth.middleware.AuthenticationMiddleware
'''
def process_request(self, request):
'''
Returned None for continue request
'''
logged_in_user = LoggedInUser()
logged_in_user.set_user(request)
return None
В сигналов импорта класс LoggedInUser и получить текущий пользователь
logged_in = LoggedInUser()
user = logged_in.user
В феврале 2015 года. Это единственный способ получить запрос пользователя в сигнале Django? –
Это правильный ответ в сочетании с [ModelAdmin.exclude] (https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.exclude) для необходимых предварительно заполненных полей очень полезно. – chirale
Это будет работать для некоторых, но не во всех случаях, например. изменения отношений 'm2m' могут быть связаны только через сигналы. – Ben