Django UpdateView更新用户about字段报TypeError:仅需1个位置参数却传入2个
问题排查与修复方案
报错根因
你遇到的报错由两处核心代码错误共同触发:
- 查询逻辑参数错误:你的自定义
User模型直接继承AbstractUser,本身不存在名为user的关联字段,get_object方法中User.objects.get(user=self.request.user)传入了不存在的查询字段,导致参数校验失败。 - UpdateView缺失必填属性:Django通用视图
UpdateView要求必须声明model、可编辑字段(fields或form_class)、提交成功后跳转地址success_url三个核心属性,你当前的视图类未配置这些属性,初始化时会触发参数缺失报错。
修复后的代码
视图类代码
from django.views.generic.edit import UpdateView from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from .models import User class ChangeAboutView(LoginRequiredMixin, UpdateView): # 声明要操作的模型 model = User # 仅开放about字段可编辑 fields = ["about"] # 提交成功后跳转的地址,替换为你实际的个人页路由名即可 success_url = reverse_lazy("user_profile") def get_object(self, queryset=None): # 直接返回当前登录用户对象,无需额外数据库查询 return self.request.user
优化说明
你原本写的form_valid方法逻辑完全冗余,可以直接删除:因为get_object已经指定了操作当前登录用户,表单提交的实例本身就是用户对象,父类UpdateView的form_valid会自动完成保存逻辑,不需要手动赋值user属性再重复保存。
额外排查点
如果完成上述修改后仍存在报错,请检查两处配置:
- 检查
urls.py中的路由配置,as_view()方法不要传入多余的未定义参数,正确写法参考:path('about/edit/', ChangeAboutView.as_view(), name='edit_about'), - 如果你自定义了关联的表单类,检查表单的
__init__方法参数接收逻辑是否正确,不要额外接收多余的位置参数。
内容的提问来源于stack exchange,提问作者John DOe
相关产品推荐
相关产品推荐

