2016-12-19 4 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に記載されているように、シグナルは多くのコードが同じイベントに関心がある場合に便利です。

この場合ですか?データ操作は、管理パネルで行われ

場合はModelAdminオブジェクトのlog_changeメソッドをオーバーライドすることを検討することができますし、現在ログインしているユーザーのユーザー名を取得するために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. あなたはそのモデルのsave()メソッドをオーバーライドすることができます。私は、データへのすべての変更をログに記録するに興味を持っていますが、現在のユーザーを保存するためのミドルウェアを使用することができます
  2. (このsnippetウィッヒは、ユーザーCREATED_BYを追加して、自動的にすべてのモデルに外部キー、参考文献をMODIFIED_BYことができます参照してください)
関連する問題