2010-12-08 5 views
0

新しいユーザーアカウントが作成されたときにユーザーのIPアドレスを記録するモデル(UserProfile)があります。モデルのsave()メソッドでREMOTE_ADDRにアクセスする方法

Djangoモデルのsave()メソッドをオーバーライドするプロセスを開始しましたが、モデル内からHttpRequest属性に正しくアクセスする方法は完全には不明です。誰か助けてもらえますか? Googleは特定の回答を私に提供できませんでした。

答えて

0

常にビューから要求情報を保存メソッドに渡す必要があります。 インスタンスを保存することは、httpリクエストから必ずしも呼び出される必要はないと考えてください(単純な例として、pythonシェルでsaveを呼び出すことを考えてください)。

あなたが節約しながら、管理内requestオブジェクトにアクセスする必要がある場合、あなたはそれがsave_model方法ですオーバーライドすることができます。

def save_model(self, request, obj, form, change): 
    # do something with obj and request here.... 
    obj.save() 

しかし、そうでない場合、あなたは常にビューからそれを渡す必要があります:

def my_view(request): 
    obj = MyClass(ip_address = request.META['REMOTE_ADDR']) 

またはこれを再利用しやすくするには、次のようにモデルのメソッドを作成します。

def foo(self, request): 
    self.ip_address = request.META['REMOTE_ADDR'] 
    self..... = request..... 

と表示され、obj.foo(request)と表示されます。

+0

ありがとうございます。私はそれを登録ビューに入れておきます。サイト管理者の1人が管理者からユーザーアカウントを作成していたときにREMOTE_ADDR値を記録した場合、ユーザーの代わりにIPアドレスが記録されるため、save_model()メソッドをadminのsave_model()メソッドに入れることはできません。 – tommytwoeyes

1

within the adminからリクエストを受けることはできますが、一般的なコードではできません。必要な場合は、ビューで手動で割り当てる必要があります。

+0

本当に?モデルのsave()メソッドからself.ip_address = request.META ['REMOTE_ADDR']を宣言する方法はありませんか? – tommytwoeyes

+0

明示的に送信される場所以外の場所からリクエストを取得する方法はありません。 –

+0

@tommytwoeyesいいえ、モデルはHTTP自体でさえ正直なところ無関心なので、 "要求"という概念は何も意味しません。関心事の分離! –

関連する問題