1

モデルの管理フォームをオーバーライドしてchoicesForeignKeyフィールドを変更しています。管理フォームで選択肢を選択して保存すると、次のようになります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(もちろん順序は別として)。

コメントself.fields['mymodel2'] = forms.ChoiceField(choices=choices)MyModel1AdminForm.__init__()てもエラーになりません...

誰でも助けることができますか?

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)
4

3 に答える 3

1

mymodel2外部キー フィールドです。カスタムの選択肢を追加する代わりに選択肢を変更する場合は、クエリセットを指定する必要があります。

self.fields['mymodel2'].queryset = MyModel2.objects.all()
于 2013-02-06T13:28:02.857 に答える
0

I ended up overriding 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)}
于 2013-02-06T15:36:15.907 に答える
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()]

ただし、選択が有効か無効かを判断するには、明らかにさらにロジックが必要です。

于 2013-02-06T14:38:01.540 に答える