2009-06-22 2 views
0

基本的には、ManyToManyフィールドを持つモデルとそのモデルから派生したモデルフォームを持ち、そのフィールドは "複数選択"選択ボックスとしてレンダリングされます。私のテンプレートでは、フィールドを省略してビューのフィールドの値を準備し、その値をrequest.POSTに渡します(実際はrequest.POSTは不変なのでrequest.POSTのコピーです)。 POSTをフォームに入力してから通常どおり続行します。私はこれを行う方法を理解することができません。なぜなら、request.POSTは単純なPython辞書ではなく、少し違った動作をするQueryDictです。カスタムの "リストタイプ"のエントリを作成するにはどうすればいいですか?

私が入力する必要があるフィールドは"not_bases"です。フォームを使用してウィジェットを作成すると、内部的にはうまく機能しますが、私の好きなUIには適していません。私は、Djangoの便利なデバッグエラーウィンドウを経由してジャンゴフォーム提出POST値を検査すると、作業のQueryDictは次のようになります。

<QueryDict: {u'not_bases': [u'005', u'00AR', u'00F', u'00FD'], [...] }> 

それは"not_bases"の値を表示されたリストであるが、それは単にリストではありません。うまく動かないので、私はただそれに貼り付けることはできません。私はドキュメントを掘り出し、.update()を見つけました。は、と表示されますが、表示されません。私はのQueryDictフォームに、私はnot_bases」というフォーム検証エラーを取得することを養うとき

<QueryDict: {u'not_bases': [u'KMER', u'KYIP'], u'reference': [u''], [...] }> 

:しかしここに私のコードです:

newPOST = request.POST.copy() 
for base in bases: 
    newPOST.update({"not_bases": base.identifier}) 

、ここで出力されるのリストを入力します。値。 " QueryDictのstr()表現から来るリスト見ているものが、まったく同じに見えても、上記の2つのケースで同じではないことは明らかです

どうすればいいですか?

+0

ソースコードを正しく理解していれば、.append()をnot_bases -listにできるはずです。 「うまくいかない」という意味を明確にしていただけますか? –

+0

ハッキングリクエスト.POSTは目標を達成するための間違った方法です。代わりに、そのフィールドを必要としないようにフォームを変更しますが、保存されたモデル(またはPOSTされたデータでフォームが行うもの)に手動で値を設定します。 –

答えて

2

あなたがここで何をしようとしているのかははっきりしませんが、QueryDictのハッキングが正しい方法であるかどうかは疑問です。

あなたはnot_basesフィールドの表示をカスタマイズしようとしている場合、あなたは単にあなたのModelForm宣言で定義をオーバーライドすることができます

class MyModelForm(forms.ModelForm): 
    not_bases = forms.ChoiceField(choices=[(base, base) for base in bases]) 

    class Meta: 
     model = MyModel 

それとも、あなたは、単にフォーム上に表示されないようにしたい場合は、あなたをそれをフォームから除外し、検証後に値を設定することができます。

class MyModelForm(forms.ModelForm): 

    class Meta: 
     model = MyModel 
     exclude = ['not_bases'] 


.... 
if request.POST: 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.not_bases = bases 
     instance.save() 

これらのいずれかが必要ですか?

+0

私の実際のコードは、not_basesと約5つの他の "XXX_bases"フィールドがあります。キャッチは、Baseオブジェクトは1つのフィールドにしか存在しないということです。これを行うために、私はこれらの "XX_fields"を描くのではなく、代わりにラジオボタンを使って自分自身を作るという形にしています。私は、POSTデータ内の私のカスタムフィールドを通過し、各フィールドのリストを作成するコードを少し書いた。私はコミット後にそれらを追加することはできません= False、しかし、私はループしているとリストを作る、なぜ単にrequest.POSTに追加していない?ちょうどステップを保存... – priestc

関連する問題