1

現在のリクエストのセッションのユーザー名を 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() を呼び出すと、オーバーライドではなく独自のバージョンが呼び出されます。私のコードはまったく実行されませんでした。

4

2 に答える 2

1

これを行う「正しい」方法は、一般的なビューでは不十分な場合に、オブジェクトを作成するための独自のビューを作成することです。作成ビューは比較的短く、外部キーを保存する方法の例が多数あります。

于 2011-12-31T19:29:33.430 に答える
0

ちなみに、Django 1.3 のドキュメントには、インスタンスごとのアクセス許可の追加など、管理アプリで使用される認証モデルへの変更が「議論されている」と記載されています。(現在の認証モデルは、モデルごとのパーミッションのみをサポートしています。)開発者は、私が達成しようとしていることの実装も追加する可能性があります。結局のところ、ユーザー関連データはほぼすべての Web サイトで使用されています。

于 2011-12-31T21:31:08.363 に答える