【问题标题】:Adding data to many-to-many field of a modelform within a view在视图中向模型表单的多对多字段添加数据
【发布时间】:2010-10-10 08:22:34
【问题描述】:
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'],}>

有什么建议吗?

【问题讨论】:

  • 能贴出模型和表格的代码吗?
  • 谢谢!这很奇怪,但我想我已经找到了导致问题的原因。

标签: django django-forms


【解决方案1】:
【解决方案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()

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

【讨论】:

  • 谢谢!这将创建 MyModelForm 的 n 条记录(每个记录都有来自 for 循环的 'person' = x),其中 n = [] 中的项目数。我需要的是创建一条 MyModelForm 记录并为“person”存储 n 个 ID。
【解决方案3】:

试试:

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

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

【讨论】:

  • 谢谢!这不起作用。 TypeError: int() 参数必须是字符串或数字,而不是 'list'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2013-07-22
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
相关资源
最近更新 更多