Django3.2添加编辑功能时报UpdateContent()存在意外instance参数错误如何解决
错误原因
你当前的视图函数和自定义的ModelForm类使用了完全相同的名称UpdateContent,在views.py的作用域内,后定义的视图函数会覆盖导入的表单类,所以你调用UpdateContent(instance=contents)时,实际调用的是你写的视图函数,而非表单类。视图函数的入参只有request和pk,不接受instance关键字参数,因此抛出该类型错误。
解决方案
通过修改命名避免冲突即可,Django社区通用命名规范可以参考:
- 视图函数使用蛇形命名,动词开头
- 表单类使用大驼峰命名,增加语义后缀区分
具体修改步骤
- 先修改forms.py里的表单类名,比如改为
ContentUpdateForm:
class ContentUpdateForm(ModelForm): class Meta: model = todo fields = ['content']
- 再修改views.py里的视图函数名,同时修改表单实例化的调用对象:
# 视图函数改为蛇形命名,和表单类区分 def update_content(request, pk): contents = todo.objects.get(id=pk) # 这里调用修改后的表单类 form = ContentUpdateForm(instance=contents) if request.method == 'POST': form = ContentUpdateForm(request.POST, instance=contents) if form.is_valid(): form.save() return redirect('/') context = {'form': form} return render(request, 'html/update.html', context)
- 最后修改urls.py中对应编辑路径的视图引用,改为新的视图函数名
update_content即可。
可选方案
如果不想修改视图函数名称,也可以在导入表单类时设置别名避免冲突,比如在views.py顶部导入表单时写:
from .forms import UpdateContent as UpdateContentForm
之后实例化表单时调用UpdateContentForm即可。
内容的提问来源于stack exchange,提问作者Zani123
相关产品推荐
相关产品推荐

