1

ユーザーがログインするときにDB行を書き込む必要があります。次のコードはmodels.pyにあります(ファイルの最後、モデル定義の後)。

models.py

from django.contrib.auth.signals import user_logged_in
from utils import *
def rec_login(sender, request, user, **kwargs):
    u_audit('some text here', user)    

user_logged_in.connect(rec_login)

modules.pyにインポートされるユーティリティモジュールがあります。次のコードは、上記の関数からutils.pyで呼び出されます。

utils.py

from app.models import *
def u_audit(msg,u):
    ua=UserLog(action=msg, user=u, actiontime=datetime.now())
    ua.save()

他のいくつかの場所(ログイン後)でu_audit()関数を再利用しています。

ユーザーがログインすると、UserLogオブジェクトのNameErrorが発生します(つまり、シグナルコールバック関数でモデル定義にアクセスできないようです)。

上記で参照されているUserLogオブジェクトは、単純なmodels.Modelです。

誰かが私が欠けているものを知っていますか?

私はmodels.pyのコールバック関数に単純なファイル書き込みを入れてみましたが、u_audit()関数でも同じことを試しました。代わりに、それは正常に機能するので、適切に呼び出されていることがわかります。他のシグナルコールバック関数が登録されており(すべてログイン後)、モデルを使用していて正常に機能しています。

4

1 に答える 1

1

循環インポートではありませんか?Utilsはモデルを参照し、モデルはutilsを参照します-動作しません。utils.pyを次のように変更してください。

def u_audit(msg,u):
    from app.models import UserLog
    ua=UserLog(action=msg, user=u, actiontime=datetime.now())
    ua.save()

しかし、そのようなものは、おそらくmodels.pyがu_auditに適した場所であり、そこに移動する必要があることを示唆しています。

于 2012-08-16T11:24:33.177 に答える