Python “django”&书信电报;用户:user556>&引用;“字段”需要有一个值;id";在此之前,可以使用多对多关系

Python “django”&书信电报;用户:user556>&引用;“字段”需要有一个值;id";在此之前,可以使用多对多关系,python,django,django-views,Python,Django,Django Views,我正在尝试保存一个M2M对象(将其设置为id为1的默认值) 我遇到的问题是以下错误: “”需要有字段“id”的值才能使用此多对多关系 我查看了以前包含相同错误的feed,但没有人解释它是在form_valid函数中发生的,就像它发生在我身上一样 我的代码如下: def form_valid(self,form): instance = form.instance instance.groups.set(1) instance.save() return su

我正在尝试保存一个M2M对象(将其设置为id为1的默认值)

我遇到的问题是以下错误:

“”需要有字段“id”的值才能使用此多对多关系

我查看了以前包含相同错误的feed,但没有人解释它是在form_valid函数中发生的,就像它发生在我身上一样

我的代码如下:

  def form_valid(self,form):

    instance = form.instance
    instance.groups.set(1)
    instance.save()
    return super(UserCreateView,self).form_valid(form)
首先需要保存实例,使其具有主键,否则无法在连接表中创建记录

因此,您可以通过以下方式实现这一点:

from django.http import HttpResponseRedirect

    def form_valid(self,form):
        instance = form.save()
        instance.groups.set(1)
        return HttpResponseRedirect(self.get_success_url())
从django.http导入HttpResponseRedirect
def表单_有效(自身、表单):
instance=form.save()
instance.groups.set(1)
返回HttpResponseRedirect(self.get\u success\u url())

这里需要返回一个
HttpResponseRedirect
,因为
super().form\u valid()
将再次将表单保存到数据库中,并将
组设置为表单中指定的组。

您必须将
instance.save()
行置于
instance.groups.set(1)上方
line。有一种叫
super().form\u valid()
的方法,如果你愿意的话(在别人的答案上看到了这一点)。类似于
response=super()?如果打印
print(instance.groups.all())
会怎么样。此外,如前所述,您需要删除
super().form\u valid()
调用。感谢我解决了这个问题。问题是我使用自定义组并调用instance.groups调用默认的django组,因此我必须将其更改为instance.appname\u groups(数据库中的字段名)并且它工作正常