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

Posted

技术标签:

【中文标题】使用基于类的 UpdateView 在 Django 中更新用户模型【英文标题】:Updating User model in Django with class based UpdateView 【发布时间】:2011-09-05 01:55:17 【问题描述】:

我正在尝试使用基于类的 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())

【问题讨论】:

【参考方案1】:

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

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.object = User.objects.get(pk=self.request.user.pk)

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

其实self.request.user是一个用户实例。

以上是关于使用基于类的 UpdateView 在 Django 中更新用户模型的主要内容,如果未能解决你的问题,请参考以下文章

用于创建和更新的基于 Django 类的视图

Django入门与实践-第22章:基于类的视图

Djang之基于角色的权限控制(RBAC)

UpdateView 中的替代形式 [关闭]

如何在 Django ModelForm 中获取实例

如何在无需重新定义整个表单的情况下使用带有通用 UpdateView 的自定义小部件?