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'],}>
有任何建议吗?
答案 0 :(得分:1)
QueryDict.setlist(key, list_)解决了这个问题。
在A workaround for Django QueryDict wrapping values in lists?
中回答答案 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设置为整数列表,而不是字符串列表。