だから私は以下を含むモデルを持っています:
class Place(models.Model):
....
created_by = models.ForeignKey(User)
私の見解はそのようなものです:
class PlaceFormView(CreateView):
form_class = PlaceForm
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(PlaceFormView, self).dispatch(*args, **kwargs)
Request.userにアクセスし、created_byをそのユーザーに設定する方法はありますか?ドキュメントを調べましたが、これに対するヒントが見つからないようです。
`
フォームの保存を行うform_valid
をオーバーライドするのはどうですか?自分で保存し、やりたいことを何でもしてから、リダイレクトします。
class PlaceFormView(CreateView):
form_class = PlaceForm
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(PlaceFormView, self).dispatch(*args, **kwargs)
def form_valid(self, form):
obj = form.save(commit=False)
obj.created_by = self.request.user
obj.save()
return http.HttpResponseRedirect(self.get_success_url())
私はこれが古いことを知っていますが、この問題を抱えている他の人々のために:
さらに簡単な方法があります。フォームを複数回保存すると常に同じモデルインスタンスが使用されるため、次のこともできます。
def form_valid(self, form):
obj = form.save(commit=False)
obj.created_by = self.request.user
return super(PlaceFormView, self).form_valid(form)
そうすれば、スーパーコールのすべての利点を得ることができます。実際には、これら2行のコードを追加するだけであり、リダイレクトロジックを複製して繰り返す必要がないことを確認するのは簡単です。
これを行う別の方法は、CreateViewのget_initial()メソッドを上書きすることでユーザーを渡し、PlaceFormクラスのsaveメソッドを変更してユーザーを保存することです。
class PlaceForm(forms.ModelForm):
...
...
...
def __init__(self, *args, **kwargs):
self.created_by = kwargs['initial']['created_by']
super(PlaceForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
obj = super(PlaceForm, self).save(False)
obj.created_by = self.created_by
commit and obj.save()
return obj
class PlaceFormView(CreateView):
...
...
form_class = PlaceForm
def get_initial(self):
self.initial.update({ 'created_by': self.request.user })
return self.initial
このようにして、保存ロジックは引き続きフォームクラス内にカプセル化されます。