Django报错:__init__()需1个位置参数却传入2个,附视图代码求助
搞定Django的
__init__() takes 1 positional argument but 2 were given 报错 Hey,我帮你排查这个问题,这个报错在Django类视图里太常见了,咱们一步步来:
最可能的核心原因
你大概率是在URL配置里直接用了类视图的名字,没加.as_view()方法。Django的类视图不能直接当函数用,得用.as_view()生成一个可调用的视图函数。如果直接传类名,Django会把请求对象request当成参数去实例化这个类,而类的__init__默认只认self这一个参数,这不就参数不匹配报错了嘛!
另外,你的代码里还有个小笔误:导入的是PostForm,但get方法里实例化的是HomeForm,这后面肯定会报NameError,得一起改了。
具体解决步骤
先改URL配置
打开你的urls.py,找到对应createPost的那条路由,把类名改成类名.as_view()的形式:# 之前的错误写法 path('create-post/', createPost, name='create_post') # 改成这个正确的 path('create-post/', createPost.as_view(), name='create_post')修正表单的笔误
把get方法里的HomeForm()换成你导入的PostForm(),顺便建议你把类视图的名字改成CreatePostView——遵循Django的大驼峰命名规范,代码看着更舒服:class CreatePostView(TemplateView): template_name = 'forum/createPost.html' def get(self, request, *args, **kwargs): form = PostForm() return render(request, self.template_name, {'form': form})额外优化:完善get方法的参数
虽然这不是当前报错的原因,但为了后续能处理URL里的捕获参数,建议get方法保留*args和**kwargs参数,就像上面代码那样写。
最后验证
改完之后重启一下Django开发服务器,再访问创建帖子的页面,这个报错应该就消失啦!
内容的提问来源于stack exchange,提问作者Geeksquid
相关产品推荐
相关产品推荐

