2011-01-12 11 views
6

にモデルのデフォルトでは、私は、次のしているユーザーを作りますか?は、現在のユーザー

(私はこのように私は主に管理ビューでそれを隠すことができますが、また、私はインスタンスを保存するとき、私はそれを毎回充填されたくないので、やってみたい)

答えて

12

あなたはrequestオブジェクトから現在ログインしているユーザーを取得する必要があるので、あなたは、モデルのsave -methodでそれを得ることはできませんが、例えば、モデル管理者のsave_model -method上書きすることができます:私が持っていた

class MyAdmin(admin.ModelAdmin): 
    def save_model(self, request, instance, form, change): 
     user = request.user 
     instance = form.save(commit=False) 
     if not change or not instance.created_by: 
      instance.created_by = user 
     instance.modified_by = user 
     instance.save() 
     form.save_m2m() 
     return instance 
+1

私はこれを管理者ビューの1つにドロップできますか? (明らかにcreated_byとmodified_byを変更した後)。あなたは私たちのためにこれを打ち破ることができますか? – Sevenearths

+0

これは私がここでそれを逃したと信じることができないので、 "リクエスト"を使用するために最も便利な解決策ですhttp://django.me/save_model – tutuDajuju

1

ノーマルmodelfieldsを持っていますデフォルトの引数。しかしForeignKeysは私の知る限りではないので、post_saveシグナルで作業する必要があると思います。

+0

+1ですが、私の場合はsave()関数をオーバーライドします:) – mouad

+0

次に、管理者のデフォルトの保存関数をオーバーライドする必要がありますか? – Sevenearths

+0

現在のバージョンのDjangoでは、確かに外部キーのデフォルトが許可されています。私は彼らが今までにしなかったことを確信していません。ですから、今日誰かが来て、この返信を読んだら、せいぜいそれは期限切れであると考えられるべきです。 –

1

私が見つかりました:hereから

from django.db import models 
from django.contrib.auth.models import User 

class CurrentUserField(models.ForeignKey): 
    def __init__(self, **kwargs): 
     super(CurrentUserField, self).__init__(User, null=True, **kwargs) 

    def contribute_to_class(self, cls, name): 
     super(CurrentUserField, self).contribute_to_class(cls, name) 
     registry = registration.FieldRegistry() 
     registry.add_field(cls, self) 

class ClientDetails(models.Model): 
    created_by = CurrentUserField() 
... 

を。しかし、より簡単な方法はありませんか?

+0

+「登録」をインポートする方法がわかりません – Sevenearths

+0

あなたは本をさらに読んでください。登録やミドルウェアなど、もっと必要なものがあります。 –

+0

おそらく右 – Sevenearths

6

を同様の問題は最近、これが私のviews.pyファイルから

def CircleAdd(request): 

    form = CircleAddForm(request.POST) 

    if form.is_valid(): 

     Circle = form.save(commit=False) 
     Circle.Author = request.user 
     Circle = Circle.save() 

され、その後、私は本当に単なるラッパーだった「円」モデルのための形式、(forms.py)

を持っていました
class CircleAddForm(ModelForm): 
    class Meta: 
     model = Circle 

フォームにインポートすることを忘れないでください!

編集:あなたも別の形で気にする必要がある場合は、キービットは偽物がコミットされてもわからない、受け入れ答えの実

+0

私は何form.py(まだdjangoに新しい)私は管理インターフェースでこれを行うことを望んでいた – Sevenearths

+0

私はモデルチェンジでデフォルトにすることができると仮定していますが、adminとサイトのビューでもデフォルトで – Sevenearths

+0

がフォーム上にあり、あなたの答えは今のところ意味があります – Sevenearths

3

ビルに続いては、あなたがこれを行うために探している場合クラスベースのビューでは、クラスビューにform_valid()メソッドをオーバーライドし、docsの指示に従うことができます:

# views.py 

from django.views.generic.edit import CreateView 

class CreateClient(CreateView): 
    def form_valid(self, form): 
     form.instance.created_by = self.request.user 
     return super(CreateClient, self).form_valid(form) 
+0

フィールドが必須フィールドである場合、これは機能しません。 – YPCrumble

4

次のようにadmin.pyでモデルの管理クラスにget_changeform_initial_dataメソッドをオーバーライドする必要があります。

# admin.py 

class ClientDetailsAdmin(admin.ModelAdmin): 
    def get_changeform_initial_data(self, request): 
     get_data = super(ClientDetailsAdmin, self).get_changeform_initial_data(request) 
     get_data['created_by'] = request.user.pk 
     return get_data 

admin.site.register(ClientDetails, ClientDetailsAdmin) 

このようにして、新しいレコードを作成するときにcreated_byフィールドがファイルされてから、最も洗練されたソリューションが得られます。

関連する問題