2009-02-27 11 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' 

がどのように私はこれのManyToManyFieldに複数のIDを保存することができますそれはの場合に動作しますか?
簡単にする必要がありますが、私はポイントを逃しています。


EDIT: 所望の結果がform.personために保存されているすべてのIDのと(「エントリ」テーブル内)MyModelFormの新しいインスタンスである(「entry_person」テーブル内の複数のレコード)。


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

任意の提案を持っているのですか?

[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

に回答

あなたはモデルのコードを投稿して形成することができますか? –

+0

ありがとう!これは変だけど、私は問題の原因を見つけたと思う。 – dmi

答えて

0

分割は次のようなリターンを入力します最初の場所にリストの変換?それともこれは

+0

ありがとうございます!これにより、MyModelFormのn個のレコード(forループから 'person' = xを持つレコード)が作成されます。ここで、nは[]内の項目の数です。私が必要とするのは、MyModelFormのレコードを1つ作成し、 'person'のIDを格納することです。 – dmi

0

てみ単なる一般的な例である:

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

これはintのリストではなく、文字列のリストにnew_form.personを設定します。

+0

ありがとうございます!これは動作しません。 TypeError:int()引数は 'list'ではなく文字列または数字でなければなりません。 – dmi

関連する問題