2009-02-27 40 views
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() argument must be a string or a number, not 'list'

这是不够公平的。它在的情况下工作:

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

我还没有成功尝试这样做:

我怎么能多个ID的保存到这个ManyToManyField?
一定很容易,但我错过了一点。


编辑: 期望的结果是(在“entry_person”表中的多条记录)存储form.person所有ID的MyModelForm的一个新实例(在“进入”表)。


UPDATE: 我似乎已经分离的问题。

如果我做的:

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

任何建议如何?

+0

您可以发布为模型的代码和形成的? – 2009-03-02 13:25:42

+0

谢谢!这很奇怪,但我想我找到了导致问题的原因。 – dmi 2009-03-03 10:14:00

回答

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

出于好奇,为什么字符串列表转换在第一位?或者这只是一个普通的例子

+0

谢谢!这创建了n个MyModelForm记录(每个在for循环中都有'person'= x),其中n = []中的项目数。我需要的是创建一个MyModelForm记录并存储n个人的'人'的记录。 – dmi 2009-02-27 15:35:27

0

尝试:

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

这将设置new_form.person到整数的列表,而不是一个字符串列表。

相关问题