35

だから私は以下を含むモデルを持っています:

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をそのユーザーに設定する方法はありますか?ドキュメントを調べましたが、これに関するヒントが見つからないようです。

`

4

3 に答える 3

35

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())
于 2011-04-26T04:00:43.230 に答える
22

私はこれが古いことを知っていますが、この問題を抱えている他の人々のために:

さらに簡単な方法があります。フォームを複数回保存すると常に同じモデルインスタンスが使用されるため、次のこともできます。

def form_valid(self, form):
    obj = form.save(commit=False)
    obj.created_by = self.request.user
    return super(PlaceFormView, self).form_valid(form)

そうすれば、スーパーコールのすべてのメリットを享受できます。実際には、これら2行のコードを追加するだけで、リダイレクトロジックを複製して繰り返す必要がないことを確認するのは簡単です。

于 2015-12-12T11:03:02.187 に答える
5

これを行う別の方法は、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

このようにして、保存ロジックはフォームクラス内にカプセル化されたままになります。

于 2011-09-11T03:33:01.747 に答える