2012-02-24 17 views
0

私は2つのモデルがあります:このdjango ModelFormはなぜ有効ではありませんか?

ProcessDao 
    ** normal fields ** 
    resource = models.ForeignKey(ResourceData, related_name='processes') 

ResourceData 
    ** Normal Fields ** 

以下のコードは、私のviews.pyである:

pdForm = ProcessDataForm(request.POST) 
rd = ResourceData.objects.get(pick_date__exact = request.POST['pick_date']) 
pdForm.resource = rd <------ here is the assignment 
if pdForm.is_valid(): 
    pdForm.save() 
else: 
    print 'pdForm is not valid ! ', pdForm.errors 
    # print "resource is not valid." 

はpdFormが有効にする方法はありますか?

+0

あなたはpdForm.errors –

+0

を印刷しようとすることができます** pdForm有効じゃない !

  • リソース
    • このフィールドは必須です。
** – MrROY

+0

ああ、どういうわけか唯一のフィールドリソースは空です。ヌルかどうかを調べるには、 'rd'をチェックする必要があります。 –

答えて

1

空白のフィールドを割り当てるために整ったフォームで作業するべきではありませんか?私はちょうどそれは、リソースがモデルで唯一のフィールドであることで機能するかどうかわからないんだけど

if pdForm.is_valid(): 
    cleanform = pdForm.save(commit = False). 
    cleanform.resource = rd 
    cleanform.save() 

: のようなものを試してみてください。私はdjango noobですが、多くの形式でForeignKeyフィールドを割り当てることで私のために働きます。

+0

** pdForm.is_valid()**はFalseを返しますので、フォローコードは実行されません。検証前にpdForm.save(コミット= False)を試みると、エラーは** "ProcessDataにはできませんデータが検証されなかったために作成されました」** – MrROY

+0

pdForm.is_valid()の前にpdForm.fields ['resource'] = rd.idを試してから、.is_valid()とsave()を実行してください。私はそれがデータをクリーニングする前にフォームフィールドを変更する方法だと思います。それが助けにならないなら、私はアイデアがありません。 – Marek

+0

pdForm.fields ['resource'] = rd、rd.idではない – Marek

1

なぜフォームオブジェクトにランダム属性を割り当てると、それが有効になると思いますか?フォームがそのインスタンス属性を使用してその妥当性をチェックするポイントはなく、ドキュメンテーションの何もそれが意味するものではありません。

これを正しく修正する方法はいくつかあります。まず、おそらく最も醜いのは、request.POSTをコピーし、一致するオブジェクトのIDをそこに挿入することです。 (元のインスタンスは不変なので、コピーする必要があります)。

Aもっと良い方法は、(フォームのMetaクラスを経由して)完全にフォームからフィールドを除外することであり、is_valid句で次の操作を行います。

object = pdForm.save(commit=False) 
rd = ResourceData.objects.get(pick_date__exact = pdForm.cleaned_data['pick_date']) 
object.resource = rd 
object.save()