使用基于类的UpdateView更新Django中的用户模型

使用基于类的UpdateView更新Django中的用户模型,django,django-forms,django-class-based-views,Django,Django Forms,Django Class Based Views,我试图用基于类的UpdateView来更新Django用户模型,该UpdateView会自动呈现给当前用户,但得到一个错误,即需要pk或slug。表单使用正确的当前用户上下文工作和呈现,但在我尝试提交更改时抛出错误。以下是我正在使用的视图: class UserUpdateView(UpdateView): form_class = UserForm model = User template_name = 'members/user_update.html'

我试图用基于类的UpdateView来更新Django用户模型,该UpdateView会自动呈现给当前用户,但得到一个错误,即需要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())

我需要覆盖更新视图上的
get\u object()
方法,而不需要覆盖form\u valid。自定义的
get\u object()
方法是:

    def get_object(self, queryset=None):
        return self.request.user

我知道这是一篇老文章,但有些东西对我来说很突出,这篇评论是给新来者的信息

self.object的get调用将起作用,但它与获取用户名的实际字段不匹配,因为它提供了用户实例:

self.object = User.objects.get(username=self.request.user)
您应该将用户名参数与实例用户名参数匹配:

self.object = User.objects.get(username=self.request.user.username)
更好的方法是使用pk(id):


可能有一种更简洁的方法可以做到这一点,所以我愿意接受建议。

实际上self.request.user是一个用户实例。
self.object = User.objects.get(pk=self.request.user.pk)