現在のリクエストのセッションのユーザー名を db オブジェクトに保存しようとしています。クラスベースのビュー内からこれを行うにはどうすればよいですか? これを行う「クリーンな」方法はありますか?何をオーバーライド/サブクラス化する必要がありますか?
次のようなモデルがあります。
from django.contrib.auth.models import User
class Entry(django.db.models.Model):
...
author = models.ForeignKey(User, editable=False)
組み込みの汎用ビューに基づくビューもありますdjango.views.generic.CreateView
。{{ form }}
また、モデルに付属するデフォルトの ModelForm クラスと、テンプレートのデフォルトを使用しています。私の知る限り、セッションと認証アプリ/ミドルウェアは適切にセットアップされています---新しいDjangoプロジェクトのデフォルトとして。
私はこの投稿を見つけましたが、これはほぼ同じことですが、間違った角度から、代わりに関数ビューを使用しています。
これまでの私の考えは、フォーム クラスの何かをオーバーライドし、ユーザー名をクリーンなデータに挿入することでした。より良い方法はありますか?正しい方法はありますか?
編集: これまでの解決策、動作しない、IntegrityError: author_id を null にすることはできません
from django.views.generic import CreateView
class Index(CreateView):
model = magicModel
template_name = "index.html"
success_url = "/magicWorked"
...
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = request.user
return super(Index, self).form_valid(form)
これは、クラス ModelFormMixin にこの実装を使用する django/views/generic/edit.py で見つけたものに基づいて作成しました。
def form_valid(self, form):
self.object = form.save()
return super(ModelFormMixin, self).form_valid(form)
これは、上記の super().form_valid() によって呼び出されるメソッドです。
編集:私の解決策の問題は、Python の継承モデルの理解でした。スーパークラスが form_valid() を呼び出すと、オーバーライドではなく独自のバージョンが呼び出されます。私のコードはまったく実行されませんでした。