2016-12-19 15 views
0

Я экспериментирую с входом в Django. Я хотел бы регистрировать каждый случай, когда пользователи сохраняют или изменяют данные. В моем коде обработчика сигнала, у меня есть что-то вроде этого:Получить имя пользователя Django для регистрации сигналов

@receiver(post_save) 
def post_save_callback(sender, instance, created, raw, using, update_fields, **kwargs): 
logger.info(
    'Post-save called for %s. Created? %r. update_fields: %s', 
    sender, created, json.dumps(update_fields) 
) 

Я хотел бы также регистрировать имя пользователя, выполняющего обработку данных, в основном, вошедшего в систему пользователя. Как я могу получить это имя пользователя?

ответ

1

Как описано в документации here сигналы полезны, когда многие фрагменты кода могут быть заинтересованы в одних и тех же событиях.

В этом случае?

Если обработка данных выполняется в панели администратора вы можете рассмотреть, чтобы переопределить log_change метод ModelAdmin объекта и вы можете использовать request.user.username, чтобы получить имя пользователя, вошедшего в систему пользователя.

def log_change(self, request, object, message): 
    logger.info('User %s changed user data %s. %s' % 
       (request.user.username, object, message) 
    super(MyClass, self).log_change(request, object, message) 

Имейте в виду, что ModelAdmin уже журнал изменений в журнале администратора, документация here

+0

Меня интересует фиксируя все изменения в данных, будь то через панель администратора или через веб-формы или REST. Поэтому я думаю, что использование сигналов - это путь, верно? – texnic

1

не может быть сделано. Текущий пользователь доступен только по запросу, который недоступен при использовании post_save. Чтобы добиться того, что вы ищете вы можете сделать один из них:

  1. вы можете переопределить необходимый метод сохранения() на этой модели.
  2. Вы можете использовать промежуточное программное обеспечение для хранения текущего пользователя (см это snippet которым можно добавить пользователя CREATED_BY и MODIFIED_BY внешнего ключа рефов к любой модели автоматически)