Django 向视图中模型表单的多对多字段添加数据

Django 向视图中模型表单的多对多字段添加数据,django,django-forms,Django,Django Forms,在我看来,我需要在保存提交的表单之前将pk id添加到表单中 class Person(models.Model): name = models.CharField(max_length=100) class Entry(models.Model): text = models.CharField(max_length=100) person = models.ManyToManyField(Person, blank=True, null=True) class M

在我看来,我需要在保存提交的表单之前将pk id添加到表单中

class Person(models.Model):
    name = models.CharField(max_length=100)

class Entry(models.Model):
    text = models.CharField(max_length=100)
    person = models.ManyToManyField(Person, blank=True, null=True)

class MyModelForm(forms.ModelForm):
    class Meta:
        model = Entry
这给了我:

int()参数必须是字符串或字符串 编号,而不是“列表”

这很公平。在以下情况下,它会起作用:

data = request.POST.copy()
# 'person' is a ManyToManyField to a 'Person' model
# a form would normally send multiple id's as POST in this format -> u'id': [u'1', u'2']
# u'1,2' (an example) is a str variable accessible to the view
data[u'person'] = u'1,2'.split(",") 
form = MyModelForm(data)
if form.is_valid():
    form.save()
我也尝试过,但没有成功:

data[u'person'] = u'1'
如何将多个id保存到此ManyToManyField?
一定很容易,但我没有抓住重点


编辑: 所需的结果是MyModelForm的一个新实例(在“entry”表中),其中存储了form.person的所有id(在“entry\u person”表中有多条记录)


更新: 我似乎已经把这个问题孤立出来了

如果我这样做:

new_form = form.save(commit=False)
new_form.person = u'1,2'.split(",")
new_form.save()
form.save_m2m()
它确实起作用,结果是:

data = {}  
data[u'person'] = u'1,2'.split(",")
data = request.POST.copy()  
data[u'person'] = u'1,2'.split(",")
如果我这样做:

{u'person': [u'1', u'2'],}  
它不工作(给出上述错误),结果如下:

data = {}  
data[u'person'] = u'1,2'.split(",")
data = request.POST.copy()  
data[u'person'] = u'1,2'.split(",")

所以我所需要的就是

<QueryDict: {u'person': [[u'1', u'2']],}>


有什么建议吗?

您输入的拆分返回以下内容:

<QueryDict: {u'person': [u'1', u'2'],}>
要在数据库中创建多个实例,您需要迭代列表:

[u'1', u'2']

出于好奇,为什么首先要将字符串转换为列表?或者,这只是一个一般性的示例,您输入的拆分返回以下内容:

<QueryDict: {u'person': [u'1', u'2'],}>
要在数据库中创建多个实例,您需要迭代列表:

[u'1', u'2']
出于好奇,为什么首先要将字符串转换为列表?或者这只是一个普通的例子

试试:

for x in u'1,2'.split(","):
  data[u'person'] = x
  form = MyModelForm(data)
  if form.is_valid():
    form.save()
这会将new_form.person设置为整数列表,而不是字符串列表。

请尝试:

for x in u'1,2'.split(","):
  data[u'person'] = x
  form = MyModelForm(data)
  if form.is_valid():
    form.save()
这将把new_form.person设置为整数列表,而不是字符串列表。

解决了这个问题

中回答可以解决此问题


回答

谢谢!这将创建MyModelForm的n条记录(每个记录的for循环中的'person'=x),其中n=[]中的项数。我需要的是创建一个MyModelForm记录并为“person”存储n个id。谢谢!这将创建MyModelForm的n条记录(每个记录的for循环中的'person'=x),其中n=[]中的项数。我需要的是创建一个MyModelForm记录并为“person”存储n个id。谢谢!这是行不通的。TypeError:int()参数必须是字符串或数字,而不是“列表”谢谢!这是行不通的。TypeError:int()参数必须是字符串或数字,而不是“列表”。您可以发布模型和表单的代码吗?谢谢!这很奇怪,但我想我已经找到了问题的原因。你能发布模型和表单的代码吗?谢谢!这很奇怪,但我想我已经找到了问题的原因。