2013-02-06 22 views
1

我正在覆蓋模型的管理員表單以修改ForeignKey字段的choices。 當選擇在管理形式的選擇和保存,我得到一個ValueError覆蓋模型管理員中的ForeignKey字段的選項時出現ValueError

Cannot assign "u'6'": "MyModel1.mymodel2" must be a "MyModel2" instance 

其中6是所選的選項的ID。

新的choices構建爲((<choice_1_id>, <choice_1_label>), (<choice_2_id>, <choice_2_label>),...),並且我得到了與渲染選擇小部件相同的html,就好像我不修改choices(除了課程的順序)。

如果我評論在MyModel1AdminForm.__init__()self.fields['mymodel2'] = forms.ChoiceField(choices=choices)我沒有得到任何錯誤...

任何人都可以幫助?

models.py

class MyModel1(models.Model): 
    mymodel2 = ForeignKey(MyModel2) 
    # more fields... 

admin.py

class MyModel1AdminForm(forms.ModelForm): 

    class Meta: 
     model = MyModel1 

    def __init__(self, *args, **kwargs): 
     super(MyModel1AdminForm, self).__init__(*args, **kwargs) 

     # create choices with ((<choice_1_id>, <choice_1_label>), (<choice_2_id>, <choice_2_label>),...) 

     self.fields['mymodel2'] = forms.ChoiceField(choices=choices, widget=SelectWithDisabled) # http://djangosnippets.org/snippets/2453/ 


class MyModel1Admin(admin.ModelAdmin): 
    form = MyModel1AdminForm 
my_site.register(MyModel1, MyModel1Admin) 

回答

1

mymodel2爲外鍵字段。您需要提供查詢集,如果你想改變選擇,而不是添加自定義的選擇:

self.fields['mymodel2'].queryset = MyModel2.objects.all() 
+0

我確實需要修改的選擇,因爲我想禁用某些選項(我使用自定義選擇部件)。我更新了我的問題,將小部件添加到forms.ChoiceField。 – jul

0

如果需要手動構建的選擇像

choices = MyModel2.objects.values_list('pk', 'title') 

應與標準ChoiceField工作,其中title是您希望用作標籤/詳細名稱的模型的字段。


看着你正在使用values_list將無法​​正常工作,所以你可以回退到列表理解的片段:

[(c.pk, {'label': c.title, 'disabled': False}) for c in MyModel2.objects.all()] 

雖然你顯然需要更多的邏輯來決定選擇是否啓用禁用。

+0

保存時出現相同的ValueError錯誤。看來我應該使用forms.ModelChoiceField,但是我只能設置一個queryset,而不是選擇。 – jul

0

我結束了覆蓋ModelChoiceField

class MyModelChoiceField(forms.ModelChoiceField): 
    def label_from_instance(self, obj): 
     level = getattr(obj, obj._mptt_meta.level_attr) 
     return {'label': obj.name), 'disabled': check_disabled(obj)} 
相關問題