2016-08-03 25 views
2

私のモデルとフォームはDjango postgresデータベースです。私がmapspotオブジェクトを作成しようとすると、「有効な選択肢を選択してください。リレーショナルオブジェクトです。有効な選択肢を選択してください。選択肢は選択肢の1つではありません

models.py

from django.db import models 
from django.utils.translation import ugettext_lazy as _ 
from django.contrib.postgres.fields import ArrayField 

class Map(models.Model): 
    name = models.CharField(max_length=128) 


class MapSpot(models.Model): 
    map = models.ForeignKey('polls.Map', related_name='polls') 
    position = ArrayField(models.IntegerField(), size=2) 
    position1 = models.IntegerField(default=0) 

    class Meta: 
     unique_together = (('map', 'position')) 

forms.py

from django.forms import ModelForm 
from .models import Map, MapSpot 

class MapForm(ModelForm): 
    class Meta: 
     model = Map 
     fields = ['name'] 

class MapSpotForm(ModelForm): 
    class Meta: 
     model = MapSpot 
     fields = ['map','position']  


>>> form = MapForm({'name':'US'}) 
>>> form.is_valid() 
True 
>>> form.save() 
<Map: Map object> 
>>> for each in Map.objects.all(): 
...  print(each.id, each.name) 
... 
1 Germantown 
2 US 
>>> spotform =MapSpotForm({'map':Map.objects.get(id=2),'position':'10,20'}) 
>>> spotform.is_valid() 
False 
>>> spotform.errors 
{'map': ['Select a valid choice. That choice is not one of the available choices.']} 
+1

あなたは辞書(通常のQueryDict)を渡すと、フォームは、それがフォームのデータの形式を連載ます前提としています。あなたの場合、モデルではなくモデルのIDが必要です。 'Map.objects.get(id = 2).pk'か、より単純な' 'map ':2'を試してみてください。フォームのデータが、通常、オブジェクトがシリアル化せずに行かないHTTP要求を介してネットワーク経由で来ると考えると、明らかです。 – dhke

答えて

3

ForeignKeyのデフォルトのフォームフィールドがModelChoiceFieldです。 ModelChoiceField "与えられたidがクエリーセットに存在することを検証します"。次回試してみてください:

spotform = MapSpotForm({'map': Map.objects.get(id=2).id, 'position': '10,20'}) 
関連する問題