1
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

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

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()

这给了我:

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

这很公平。在以下情况下它确实有效:

data[u'person'] = u'1'

我也试过这个没有成功:

new_form = form.save(commit=False)
new_form.person = u'1,2'.split(",")
new_form.save()
form.save_m2m()

如何将多个 id 保存到这个 ManyToManyField?
一定很容易,但我没有抓住重点。


编辑:期望的结果是 MyModelForm 的一个新实例(在“entry”表中),其中所有 id 都存储为 form.person(“entry_person”表中的多个记录)。


更新: 我似乎已经隔离了这个问题。

如果我做:

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

确实有效,结果是:

{u'person': [u'1', u'2'],}  

如果我做:

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'],}>

有什么建议吗?

4

3 回答 3

1

QueryDict.setlist(key, list_)解决了这个问题。

在Django QueryDict 将值包装在列表中的解决方法中回答?

于 2009-03-06T13:03:04.490 回答
0

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

[u'1', u'2']

要在数据库中创建多个实例,您需要遍历列表:

for x in u'1,2'.split(","):
  data[u'person'] = x
  form = MyModelForm(data)
  if form.is_valid():
    form.save()

出于好奇,为什么首先要进行字符串到列表的转换?或者这只是一个一般的例子

于 2009-02-27T15:08:35.650 回答
0

尝试:

new_form.person = [int(x) for x in u'1,2'.split(",")]

这会将 new_form.person 设置为整数列表,而不是字符串列表。

于 2009-02-27T18:24:33.760 回答