2013-02-06 23 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)} 
相关问题