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

私の見解では、送信されたフォームを保存する前に、送信されたフォームにpkidを追加する必要があります。

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

このManyToManyFieldに複数のIDを保存するにはどうすればよいですか?
簡単なはずですが、要点が欠けています。


編集:望ましい結果は、すべてのIDがform.person('entry_person'テーブルの複数のレコード)に格納されたMyModelFormの1つの新しいインスタンス('entry'テーブル内)です。


更新: 問題を切り分けたようです。

私が行った場合:

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

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 に答える