将数据添加到视图中的模型形式的多对多字段中

时间:2009-02-27 14:36:33

标签: django django-forms

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()参数必须是字符串或a   号码,而不是'列表'

这是公平的。它适用于以下情况:

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'表中),其中存储了form.person的所有id('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'],}>

有任何建议吗?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分: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()

出于好奇,为什么要首先列出转换列表?或者这只是一个通用的例子

答案 2 :(得分:0)

尝试:

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

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