33

現在のユーザーで自動的にレンダリングされるクラスベースのUpdateViewでDjangoユーザーモデルを更新しようとしていますが、pkまたはslugが必要であるというエラーが発生します。フォームは機能し、適切な現在のユーザーコンテキストでレンダリングされますが、変更を送信しようとするとエラーがスローされます。以下は私が使用しているビューです:

class UserUpdateView(UpdateView):
    form_class = UserForm
    model = User
    template_name = 'members/user_update.html'

    def get(self, request, **kwargs):
        self.object = User.objects.get(username=self.request.user)
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(object=self.object, form=form)
        return self.render_to_response(context)

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())
4

2 に答える 2

32

更新ビューでメソッドをオーバーライドする必要がget_object()あり、form_validをオーバーライドする必要はありません。カスタムget_object()メソッドは次のとおりです。

    def get_object(self, queryset=None):
        return self.request.user
于 2011-06-07T21:08:39.050 に答える
6

私はこれが古い投稿であることを知っていますが、何かが私に際立っていました、そしてこのコメントは新参者のための情報です。

self.objectのget呼び出しは機能しますが、ユーザーインスタンスを提供しているため、usernameを取得するための実際のフィールドと一致しません。

self.object = User.objects.get(username=self.request.user)

username引数をインスタンスusername引数と一致させる必要があります。

self.object = User.objects.get(username=self.request.user.username)

さらに良いことに、pk(id)を使用します。

self.object = User.objects.get(pk=self.request.user.pk)

これを行うためのより良い方法があるかもしれないので、私は提案を受け入れます。

于 2016-04-29T03:46:30.893 に答える