Django中TypeError: __init__()参数不匹配问题求助
解决TypeError: init() takes 1 positional argument but 2 were given(Django动态表单集)
嘿,我刚看完你的代码和报错信息,这个问题其实是因为你对Django inline表单集的初始化方式理解错了,咱们一步步来解决:
错误原因
你用inlineformset_factory创建的FamilyMemberFormSet是关联模型表单集,它的初始化方法要求第一个参数必须是关联的Profile实例(也就是instance参数),而你在POST请求分支里直接把request.POST作为第一个参数传进去,就导致了参数不匹配——表单集期待第一个参数是Profile对象,结果你传了POST数据,自然就报"需要1个位置参数但给了2个"的错误。
修复步骤
1. 修改视图的get_context_data方法
你需要在初始化表单集时,明确传入关联的Profile实例:
def get_context_data(self, **kwargs): data = super(ProfileFamilyMemberCreate, self).get_context_data(**kwargs) if self.request.POST: # 获取已经绑定了POST数据的Profile表单 profile_form = data['form'] # 传入未保存的Profile实例 + POST数据来初始化表单集 data['familymembers'] = FamilyMemberFormSet( self.request.POST, instance=profile_form.instance ) else: # GET请求时,传入空的Profile实例来渲染空表单 data['familymembers'] = FamilyMemberFormSet(instance=Profile()) return data
2. 调整form_valid方法避免重复保存
原来的super().form_valid(form)会再次调用form.save(),而你已经在事务里保存过对象了,直接重定向到成功页面即可:
def form_valid(self, form): context = self.get_context_data() familymembers = context['familymembers'] with transaction.atomic(): self.object = form.save() if familymembers.is_valid(): familymembers.instance = self.object familymembers.save() # 直接重定向,避免super方法重复保存对象 return redirect(self.get_success_url())
额外检查点
确保你的FamilyMember模型里有正确的外键关联到Profile:
# models.py示例 class FamilyMember(models.Model): profile = models.ForeignKey(Profile, on_delete=models.CASCADE) # 其他字段...
这样修改后,表单集就能正确关联到Profile实例,不管是GET请求渲染空表单,还是POST请求处理提交数据,都不会再触发那个类型错误了。
内容的提问来源于stack exchange,提问作者Lucid Polygon
相关产品推荐
相关产品推荐

