2016-03-26 13 views
0

セッションのユーザーをモデルのsave()メソッドにプルしようとしています。 The docs for HttpRequestと私が見つけたすべての例では、オブジェクトがインスタンス化されていると仮定していますが、インスタンス化を行うメソッドを見つけることはできません。Django 1.9のcreated_byフィールドの現在のユーザーを取得するにはどうすればよいですか?

私はHttpRequest.userを使用するべきだと思っていますが、私は実際にそれを行うことができるように私のモデルでインスタンスを生成する方法を知らない。

これは私のsave()オーバーライドです。それはtype object 'HttpRequest' has no attribute 'user'を生成しますが、これはクラスではなく、本当に驚くべきことではないオブジェクト参照で考える:あなたがいる場合

def save(self, *args, **kwargs): 
    ''' On save, update timestamps ''' 
    if not hasattr(self, 'id'): 
     self.date_created = timezone.now() 
     self.created_by = HttpRequest.user 

    self.last_updated_date = timezone.now() 
    self.last_updated_by = HttpRequest.user 

    super(Caregiver, self).save(*args, **kwargs) 

views.pyは、より多くの情報

class CaregiverCreateView(CreateView): 
    template_name = 'single_form_generic.html' 
    model = Caregiver 
    form_class = CaregiverCreateForm 

答えて

0

私は少し周りを掘っていたが、私はあなたの将来のGooglerのための答えを見つけることに終わるんでした:

class based view docsが実際に持っています関連する例。ビューはすでにリクエストにアクセスでき、フォームとモデルを結びつけることができるので、そこのform_validメソッドをオーバーライドするだけで、実際にビューのサブミットに注入するだけで済みます。

def form_valid(self, form): 
    form.instance.created_by = self.request.user 
    form.instance.last_updated_by = self.request.user 
    return super(CaregiverCreateView, self).form_valid(form) 
1

ために追加しましたsave()を明示的に呼び出すと、メソッドに直接ユーザーインスタンスを渡すことができます。

def save(self, user, *args, **kwargs): 
    # use the user 

そして、あなたはviews.pyでそれを呼び出したとき、ん:

instance.save(request.user) 
+0

私はクラスベースのビューを使用しています。どのように私はそれを追加しますか?わかりやすく私の質問にviews.pyを追加しました。 – meteorainer

+0

私はこの方法を使用しませんでしたが、私は答えにつながったので+1しました。 – meteorainer

+0

クール。あなたの答えを見つけてうれしいです。私は第二の見方で取りました。あなたがしようとしているような音は、クラスベースのビューで 'form_valid'メソッドをオーバーライドすることによって完全に達成できます。 –

2

django-cuserこれは簡単に行うことができます。このライブラリは、現在のユーザを取得するためにビュー、モデルメソッドなどで呼び出すことができるミドルウェアを追加します。モデルのsaveメソッドでユーザーが割り当てられている場合は、次のようにミドルウェアを呼び出してセッションを検査するだけです。

は、一度設定し、次のように呼び出すことができます。

from cuser.middleware import CuserMiddleware 

class YourModel(models.Model): 
    def save(self, *args, **kwargs): 
     self.created_by = CuserMiddleware.get_user() 
     super(YourModel,self).save(*args, **kwargs) 
関連する問題