2013-09-01 38 views
0

我的models.py如何從django中的MultipleChoiceField獲取外鍵數據?

relay = models.ForeignKey(RelayAddress,related_name="relay") 
sister_relay = models.ForeignKey(RelayAddress,related_name="sister_relay") 
"RelayAddress" is another table 

我admin.py

sister = RelayAddress.objects.all() 
dict=[] 
for i in sister: 
    dict.append((i.id,i.display_name())) 
    #sister_relay_id=forms.ModelMultipleChoiceField(label=u'sister_relay',widget=forms.CheckboxSelectMultiple(),queryset=RelayAddress.objects.all()) 
    sister_relay_id=forms.MultipleChoiceField(label=u'sister_relay',widget=forms.CheckboxSelectMultiple(),choices=dict) 
def save(self, *args, **kwargs): 
    u = self.instance 
my_list =self.cleaned_data['sister_relay_id'] 
... 
... 
return super(RelaySisterRelationForm, self).save(*args,**kwargs) 

的問題是:

當我保存,錯誤happend,「不能將[U'' ]:RelayAddress .sister_relay必須是RelayAddress實例「(像這樣)

如果我沒有在模型中使用ForeignKey,它可以工作。

但我想同時使用ForeignKey和複選框,從複選框中獲取多個數據作爲列表,並保存在我的意志。

我也試過「ModelMultipleChoiceField」,不起作用。

我應該怎麼做?非常感謝您的幫助!

回答

0

你需要一個ModelChoiceField

sister_relay=forms.ModelChoiceField(queryset=RelayAddress.objects.all()) 

然後在你的視圖

if request.method.POST: 
    form = RelayForm(request.POST, request.FILES) 
    if form.is_valid(): 
     obj = form.save(commit=False) 
     obj.sister_relay = form.cleaned_data['sister_relay'] 
     obj.save() 

一個ModelChoiceField的價值將被轉換成查詢集的一個實例。

0

我不明白你的代碼是,你如何將一個列表存儲到ForeignKey字段。

如果你的模型應該有多個「sister_relay」,這個字段應該是一個ManyToManyField而不是一個ForeignKey字段。如果你這樣做ModelMultipleChoiceField將完美工作。

如果模型不應該有多個「sister_relay」,那麼沒有理由在表單中使用MultipleChoiceField,ModelChoiceField就足夠了。

https://docs.djangoproject.com/en/dev/ref/models/fields/