2016-08-03 15 views
2

Hier ist meine Modelle und Formular in Django Postgres Datenbank.Wenn ich versuche, das Mapspot-Objekt zu erstellen, erhalte ich einen Fehler "Wählen Sie eine gültige Wahl", obwohl es nur ein relationales Objekt.Wählen Sie eine gültige Auswahl..Diese Auswahl ist keine der verfügbaren Optionen

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

Wenn Sie ein Wörterbuch (in der Regel ein QueryDict) passieren, nimmt die Form eine Form der Daten der Form serialisiert wird. In Ihrem Fall erwartet es die ID eines Modells, nicht das Modell. Versuchen Sie 'Map.objects.get (id = 2) .pk' oder noch einfachere '' map ': 2'. Es ist ziemlich klar, wenn Sie denken, dass die Daten des Formulars normalerweise über eine HTTP-Anfrage über das Netzwerk kommen, wo Objekte nicht ohne Serialisierung gehen können. – dhke

Antwort

3

Standardformularfeld für ForeignKey ist ModelChoiceField. ModelChoiceField "überprüft, ob die angegebene ID im Abfrage-Set vorhanden ist". Versuchen Sie weiter:

spotform = MapSpotForm({'map': Map.objects.get(id=2).id, 'position': '10,20'})