2

モデルにCharField with choicesありましたが、このフィールド render as が必要で、CheckboxSelectMultipleリストをフォーム クラスに返します。選択肢TypedChoiceFieldで自動的に割り当てられるフォームクラスでは、検証されません。Fieldフィールドを変更することにし、リストを検証するためにform_classで新しいフィールドを作成しました。TypedMultipleChoiceField form_class

class MultipleTypedChoiceModelField(models.Field):
    def get_internal_type(self):
        return 'MultipleTypedChoiceModelField'

    def formfield(self, **kwargs):
        defaults =  {'form_class': TypedMultipleChoiceField, }
        defaults.update(kwargs)
        return super(MultipleTypedChoiceModelField, self).formfield(**defaults)

しかし、それは効果がありません。モデル フィールドの選択肢をコメント アウトすると、タイプは MultipleTypedChoiceModelField になります。したがって、form_class は、選択リストの定義を使用してアプライアンスに指定されていると思います。

def formfield(self, **kwargs):
    if self._choices: # or self.choices:
        defaults =  {'form_class': TypedMultipleChoiceField, }
        defaults.update(kwargs)
    return super(MultipleTypedChoiceModelField, self).formfield(**defaults)

しかし、それも効果がありません。の割り当てがどこにあるのかわかりませんform_classたぶん、この動作を変更するより良い方法がありますか? 明らかに不必要なので、多対多の関係を持つモデルを追加する予定はありません。

4

1 に答える 1

1

問題の一部は、モデルに次のようなものがある場合です。

myfield = models.CharField(max_length=100, choices=MY_FIELD_CHOICES)

Django は、myfield には1 つの選択肢しかない、複数の選択肢があると仮定します。

これを実装する最も簡単な方法は、モデルに次のようなものを含めることです。

myfield = models.CharField(max_length=100)

次に、カスタムフォームで:

myfield = forms.MultipleChoiceField(choices=MY_FIELD_CHOICES, widget=forms.CheckboxSelectMultiple())
于 2011-11-15T15:40:58.177 に答える