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値が扱われる仕様になっているのであろう。