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

时间:2011-05-30 21:53:31

标签: django django-forms django-class-based-views

我正在尝试使用基于类的UpdateView更新Django User模型,该模型会自动呈现给当前用户,但是收到了需要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())

2 个答案:

答案 0 :(得分:28)

我需要在更新视图上覆盖get_object()方法,不需要覆盖form_valid。自定义get_object()方法是:

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

答案 1 :(得分:4)

我知道这是一个很老的帖子,但有些东西对我来说很突出,这个评论是新手的信息。

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

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)

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