にモデルのデフォルトでは、私は、次のしているユーザーを作りますか?は、現在のユーザー
(私はこのように私は主に管理ビューでそれを隠すことができますが、また、私はインスタンスを保存するとき、私はそれを毎回充填されたくないので、やってみたい)
にモデルのデフォルトでは、私は、次のしているユーザーを作りますか?は、現在のユーザー
(私はこのように私は主に管理ビューでそれを隠すことができますが、また、私はインスタンスを保存するとき、私はそれを毎回充填されたくないので、やってみたい)
あなたは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
ノーマルmodelfieldsを持っていますデフォルトの引数。しかしForeignKeysは私の知る限りではないので、post_saveシグナルで作業する必要があると思います。
+1ですが、私の場合はsave()関数をオーバーライドします:) – mouad
次に、管理者のデフォルトの保存関数をオーバーライドする必要がありますか? – Sevenearths
現在のバージョンのDjangoでは、確かに外部キーのデフォルトが許可されています。私は彼らが今までにしなかったことを確信していません。ですから、今日誰かが来て、この返信を読んだら、せいぜいそれは期限切れであると考えられるべきです。 –
私が見つかりました: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()
...
を。しかし、より簡単な方法はありませんか?
+「登録」をインポートする方法がわかりません – Sevenearths
あなたは本をさらに読んでください。登録やミドルウェアなど、もっと必要なものがあります。 –
おそらく右 – Sevenearths
を同様の問題は最近、これが私の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
フォームにインポートすることを忘れないでください!
編集:あなたも別の形で気にする必要がある場合は、キービットは偽物がコミットされてもわからない、受け入れ答えの実
私は何form.py(まだdjangoに新しい)私は管理インターフェースでこれを行うことを望んでいた – Sevenearths
私はモデルチェンジでデフォルトにすることができると仮定していますが、adminとサイトのビューでもデフォルトで – Sevenearths
がフォーム上にあり、あなたの答えは今のところ意味があります – Sevenearths
ビルに続いては、あなたがこれを行うために探している場合クラスベースのビューでは、クラスビューに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)
フィールドが必須フィールドである場合、これは機能しません。 – YPCrumble
次のように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
フィールドがファイルされてから、最も洗練されたソリューションが得られます。
私はこれを管理者ビューの1つにドロップできますか? (明らかにcreated_byとmodified_byを変更した後)。あなたは私たちのためにこれを打ち破ることができますか? – Sevenearths
これは私がここでそれを逃したと信じることができないので、 "リクエスト"を使用するために最も便利な解決策ですhttp://django.me/save_model – tutuDajuju