diadia

興味があることをやってみる。自分のメモを残しておきます。

djnago test ModelFormにForeignKeyが含まれる場合のテスト

例えばItemモデルにCategoryというForeignKeyが含まれているとする。 その上ForeignKeyオブジェクトから選択させる方式でItemオブジェクトを生成している。

Itemオブジェクト生成のためにItemModelFormを作成すると以下のような感じになる。

class ItemModelForm(forms.ModelForm):
    category = forms.ModelChoiceField(queryset=Category.objects.all())

    class Meta:
        model  = Item
        fields = ('category', 'title', 'price','description',  )

このModelFormには一癖ありテストに手こずったのでメモしておく。

ModelChoiceFieldを含むModelFormの挙動について。

ユーザーがModelChoiceFieldから特定のオブジェクトを選択すると、当然ながらModelFormのオブジェクト内にForeignKeyのオブジェクトが格納されてform.is_valid()処理が実行される。 しかしながら手動で同じ環境を作るときは注意が必要であった。ForeignKeyはForeignKeyのオブジェクトのidとしてModelFormに格納されている。したがって以下のようにしてもエラーがずっと出続けるだけで一向に進めないのだ。

category_obj = Category.objects.get(id=2)
data = {
             'category':categoy_obj, 
             'title': "hduhig", 
             'price':100,
             'description':"hsudahisug"
             }

form = ItemModelForm(data)
print(form.is_valid())
>>> False

こうする。 要するにModelFormにForeignKeyを格納する際にはForeignKeyのid値で入れること。

category_obj = Category.objects.get(id=2)
data = {
             'category':categoy_obj.id, 
             'title': "hduhig", 
             'price':100,
             'description':"hsudahisug"
             }

form = ItemModelForm(data)
print(form.is_valid())
>>> True

理由はよくわからないがSerializerのところでもForeignKeyの表示はid値で表現されている。FormのようなタイプにおいてはForeignKeyはid値が扱われる仕様になっているのであろう。

その他djangoのテストに関連するもの

Djangoのテストを実装 - diadia